node.js - route - typescript express mongodb
Evite la advertencia de que "el analizador de cadenas URL actuales está en desuso" configurando useNewUrlParser en verdadero (16)
Tengo una clase de envoltura de base de datos que establece una conexión con alguna instancia de MongoDB:
async connect(connectionString: string): Promise<void> {
this.client = await MongoClient.connect(connectionString)
this.db = this.client.db()
}
Esto me dio una advertencia:
(nodo: 4833) Advertencia de desaprobación: el analizador de cadena de URL actual está en desuso y se eliminará en una versión futura. Para usar el nuevo analizador, pase la opción {useNewUrlParser: true} a MongoClient.connect.
El método
connect()
acepta una instancia de
MongoClientOptions
como segundo argumento.
Pero no tiene una propiedad llamada
useNewUrlParser
.
También intenté establecer esas propiedades en la cadena de conexión de esta forma:
mongodb://127.0.0.1/my-db?useNewUrlParser=true
pero no tiene efecto en esas advertencias.
Entonces, ¿cómo puedo configurar
useNewUrlParser
para eliminar esas advertencias?
Esto es importante para mí, ya que la secuencia de comandos debe ejecutarse como cron y esas advertencias dan como resultado correo basura no deseado.
Estoy usando el controlador
mongodb
en la versión
3.1.0-beta4
con el correspondiente paquete
@types/mongodb
en
3.0.18
.
Ambos son los últimos disponibles con
npm install
.
Solución
Usando una versión anterior del controlador mongodb:
"mongodb": "~3.0.8",
"@types/mongodb": "~3.0.18"
Actualizado para ES8 / await
El código de demostración ES8 incorrecto que proporciona MongoDB inc también crea esta advertencia.
MongoDB proporciona el siguiente consejo, que es incorrecto
Para usar el nuevo analizador, pase la opción {useNewUrlParser: true} a MongoClient.connect.
Hacer esto causará el siguiente error:
TypeError: el argumento final para
executeOperation
debe ser una devolución de llamada
En
su
lugar,
la opción debe proporcionarse a
new MongoClient
:
Vea el código a continuación:
const DATABASE_NAME = ''mydatabase'',
URL = `mongodb://localhost:27017/${DATABASE_NAME}`
module.exports = async function() {
const client = new MongoClient(URL, {useNewUrlParser: true})
var db = null
try {
// Note this breaks.
// await client.connect({useNewUrlParser: true})
await client.connect()
db = client.db(DATABASE_NAME)
} catch (err) {
console.log(err.stack)
}
return db
}
Así es como lo tengo, la sugerencia no se mostró en mi consola hasta que actualicé npm un par de días antes.
.connect tiene 3 parámetros, el URI, opciones y error.
mongoose.connect(
keys.getDbConnectionString(),
{ useNewUrlParser: true },
err => {
if (err) throw err;
console.log(`Successfully connected to database.`);
}
);
Como se señaló, la versión
3.1.0-beta4
del controlador se "liberó en la naturaleza" un poco antes por el aspecto de las cosas.
La versión es parte del trabajo en curso para admitir las funciones más nuevas en la próxima versión de MongoDB 4.0 y realizar otros cambios en la API.
Uno de esos cambios que activan la advertencia actual es la opción
useNewUrlParser
, debido a algunos cambios en torno a cómo funciona realmente la
useNewUrlParser
del URI de conexión.
Más sobre eso más adelante.
Hasta que las cosas se "calmen", probablemente sería
recomendable "fijar"
al menos a la versión secundaria para
3.0.x
versiones
3.0.x
:
"dependencies": {
"mongodb": "~3.0.8"
}
Eso debería hacer que la rama
3.1.x
se instale en las instalaciones "nuevas" de los módulos de nodo.
Si ya instaló una versión "más reciente" que es la versión "beta", debe limpiar sus paquetes (y
package-lock.json
) y asegurarse de que la descarga a una
3.0.x
serie
3.0.x
En cuanto al uso real de las "nuevas" opciones de URI de conexión, la principal restricción es incluir el
port
en la cadena de conexión:
const { MongoClient } = require("mongodb");
const uri = ''mongodb://localhost:27017''; // mongodb://localhost - will fail
(async function() {
try {
const client = await MongoClient.connect(uri,{ useNewUrlParser: true });
// ... anything
client.close();
} catch(e) {
console.error(e)
}
})()
Esa es una regla más "estricta" en el nuevo código.
El punto principal es que el código actual es esencialmente parte del código del repositorio "node-native-driver" (npm
mongodb
), y el "nuevo código" se importa realmente desde la biblioteca
mongodb-core
que "apuntala" el nodo "público" conductor.
El punto de la "opción" que se agrega es "facilitar" la transición al agregar la opción al nuevo código, de modo que el analizador más nuevo (en realidad basado en la
url
) se use en el código, agregue la opción y borre la advertencia de desaprobación y, por lo tanto, verifique que las cadenas de conexión pasadas cumplan con lo que espera el nuevo analizador.
En versiones futuras, el analizador "heredado" se eliminaría y, a continuación, el nuevo analizador simplemente será lo que se use, incluso sin la opción. Pero para ese momento, se espera que todo el código existente tenga una amplia oportunidad para probar sus cadenas de conexión existentes contra lo que el nuevo analizador está esperando.
Entonces, si desea comenzar a usar las nuevas funciones del controlador a medida que se lanzan, entonces use la
beta
disponible y las posteriores y, de manera ideal, asegúrese de proporcionar una cadena de conexión que sea válida para el nuevo analizador habilitando la opción
MongoClient.connect()
en
MongoClient.connect()
.
Si en realidad no necesita acceder a las funciones relacionadas con la vista previa de la versión MongoDB 4.0, fije la versión a una serie
3.0.x
como se indicó anteriormente.
Esto funcionará como se documenta y se "fija"; esto garantiza que
3.1.x
versiones
3.1.x
no se "actualicen" con respecto a la dependencia esperada hasta que realmente desee instalar una versión estable.
El código resaltado a continuación para la conexión de la mangosta solucionó la advertencia para el controlador de la mangosta
mongoose.connect(''mongodb://localhost:27017/test'', { useNewUrlParser: true });
El ejemplo completo para ExpressJS, el caso de llamadas de api y el envío de json es el siguiente:
...
app.get(''/api/myApi'', (req, res) => {
MongoClient.connect(''mongodb://user:[email protected]:port/dbname'',
{ useNewUrlParser: true }, (err, db) => {
if (err) throw err
const dbo = db.db(''dbname'')
dbo.collection(''myCollection'')
.find({}, { _id: 0 })
.sort({ _id: -1 })
.toArray(
(errFind, result) => {
if (errFind) throw errFind
const resultJson = JSON.stringify(result)
console.log(''find:'', resultJson)
res.send(resultJson)
db.close()
},
)
})
}
El formato de la cadena de conexión debe ser mongodb: // usuario: contraseña @ host: puerto / db
p.ej:
MongoClient.connect(''mongodb://user:[email protected]:27017/yourDB'', { useNewUrlParser: true } )
El problema se puede resolver dando el número de puerto y usando este analizador {useNewUrlParser: true}. La solución puede ser:
mongoose.connect("mongodb://localhost:27017/cat_app", { useNewUrlParser: true });
Resuelve mi problema.
Estaba usando mlab.com como base de datos mongo. Separé la cadena de conexión a una carpeta diferente llamada config y dentro de keys.js mantuve la cadena de conexión que era
module.exports = {
mongoURI: "mongodb://username:[email protected]:47267/projectname"
};
y el código del servidor era
const express = require("express");
const mongoose = require("mongoose");
const app = express();
//DB config
const db = require("./config/keys").mongoURI;
//connect to mongo DB
mongoose
.connect(
db,
{ useNewUrlParser: true } //need this for api support
)
.then(() => console.log("mongoDB connected"))
.catch(err => console.log(err));
app.get("/", (req, res) => res.send("hello!!"));
const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Server running on port ${port}`)); //tilda not inverted comma
necesitas escribir {useNewUrlParser: true} después de la cadena de conexión como lo hice anteriormente.
simplemente hay que hacer lo que tiene que hacer:
mongoose.connect(connectionString,{ useNewUrlParser: true }
//or
MongoClient.connect(connectionString,{ useNewUrlParser: true }
Estas líneas hicieron el truco para todas las demás advertencias de desprecio también:
const db = await mongoose.createConnection(url, { useNewUrlParser: true });
mongoose.set(''useCreateIndex'', true);
mongoose.set(''useFindAndModify'', false);
No creo que necesites agregar
{ useNewUrlParser: true }
.
Depende de usted si desea utilizar el nuevo analizador de url ya. Eventualmente, la advertencia desaparecerá cuando Mongo cambie a su nuevo analizador de URL.
Edición: como se especifica aquí https://docs.mongodb.com/master/reference/connection-string/ no necesita configurar el número de puerto.
Solo agregando
{ useNewUrlParser: true }
es suficiente.
No hay nada que cambiar, pase solo en la función de conexión
{useNewUrlParser: true }
esto funcionará
MongoClient.connect(url,{ useNewUrlParser: true },function(err,db){
if(err){
console.log(err);
}
else {
console.log(''connected to ''+ url);
db.close();
}
})
Revisa tu versión mongo
mongo --version
Si está utilizando la versión> = 3.1.0, cambie el archivo de conexión de mongo a ->
MongoClient.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true })
o su archivo de conexión de mangosta a ->
mongoose.connect("mongodb://localhost:27017/YourDB", { useNewUrlParser: true });
Lo ideal es que sea una característica de la versión 4, pero v3.1.0 y superior también la admiten. Echa un vistazo a MongoDB Github para más detalles.
Si el
username
o
password
tiene
@
carácter.
Entonces usa asi
mongoose
.connect(
''DB_url'',
{ user: ''@dmin'', pass: ''p@ssword'', useNewUrlParser: true }
)
.then(() => console.log(''Connected to MongoDB''))
.catch(err => console.log(''Could not connect to MongoDB'', err));
solo necesitas agregar
{useNewUrlParser: true}
Dentro del metodo de mongoose.connect
{ useNewUrlParser: true }
agregar
{ useNewUrlParser: true }
en el método mongoose.connect ().
mongoose.connect(''mongodb://localhost:27017/Notification'',{ useNewUrlParser: true });
**We were using**
mongoose.connect("mongodb://localhost/mean-course").then(
(res) => {
console.log("Connected to Database Successfully.")
}
).catch(() => {
console.log("Conntection to database failed.");
});
*-----> This gives url parser error*
**Correct Syntax is**:
mongoose.connect("mongodb://localhost:27017/mean-course" , { useNewUrlParser: true }).then(
(res) => {
console.log("Connected to Database Successfully.")
}
).catch(() => {
console.log("Conntection to database failed.");
});