J'essaie de publier les données dans la base de données que j'ai créée sur mLab et j'obtiens cette erreur, mais je ne sais pas ce qui ne va pas. J'ai également lu une question déjà posée sur ce sujet, mais je ne parviens pas à résoudre mon erreur Je suis nouveau à cela. Donc, je poste ici le code que je tente d’implémenter et qui provient de ce tutoriel https://medium.freecodecamp.com/building-a-simple-node-js-api-in-under-30- minutes-a07ea9e390d2 .
server.js
const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const db = require('./config/db');
const app = express();
const port = 8000;
app.use(bodyParser.urlencoded({extened:true}));
MongoClient.connect(db.url,(err,database) =>{
if (err) return console.log(err)
require('./app/routes')(app,{});
app.listen(port,() => {
console.log("We are live on"+port);
});
})
db.js
module.exports = {
url : "mongodb://JayTanna:[email protected]:47510/testing"
};
index.js
const noteroutes = require('./note_routes');
module.exports = function(app,db)
{
noteroutes(app,db);
};
note_routes.js
module.exports = function(app, db) {
app.post('/notes', (req, res) => {
const note = { text: req.body.body, title: req.body.title };
db.collection('notes').insert(note, (err, result) => {
if (err) {
res.send({ 'error': 'An error has occurred' });
} else {
res.send(result.ops[0]);
}
});
});
};
Dans votre server.js, vous transmettez un objet vide pour lequel vous devez passer la base de données comme second argument, comme le prévoit votre fonction d'exportation routes/index.js.
PFB a mis à jour le fichier server.js:
const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const db = require('./config/db');
const app = express();
const port = 8000;
app.use(bodyParser.urlencoded({extended:true}));
MongoClient.connect(db.url,(err,database) =>{
if (err) return console.log(err)
//require('./app/routes')(app,{});
//check below line changed
require('./app/routes')(app, database);
app.listen(port,() => {
console.log("We are live on"+port);
});
});
J'ai donc voté pour la réponse qui disait simplement descendre à mongodb 2.2.33 parce que je l'avais essayée et que ça fonctionnait, mais ensuite je me sentais bizarre de simplement rétrograder pour résoudre un problème. 3.0. Si quelqu'un trouve ce problème et que son problème ne passe pas à une référence vide comme la réponse acceptée, essayez cette solution.
Quand tu cours ..
MongoClient.connect(db.url,(err,database) =>{ }
Dans mongodb version> = 3.0, cette variable database
est en réalité l'objet parent de l'objet auquel vous essayez d'accéder avec database.collection('whatever')
. Pour accéder au bon objet, vous devez référencer votre nom de base de données, pour moi c'était en faisant
MongoClient.connect(db.url,(err,database) =>{
const myAwesomeDB = database.db('myDatabaseNameAsAString')
myAwesomeDB.collection('theCollectionIwantToAccess')
}
Cela corrigeait mes erreurs lors de l'exécution de mon serveur node.js. J'espère que cela aidera quelqu'un qui ne veut pas simplement rétrograder sa version.
(de plus, si vous ne connaissez pas votre nom de base de données pour une raison quelconque, utilisez simplement console.log (base de données) et vous le verrez comme un attribut d'objet)
EDIT (juin 2018):
Selon this , le rappel renvoie en réalité le client connecté de la base de données, au lieu de la base de données elle-même.
Par conséquent, pour obtenir l'instance de base de données, nous devons utiliser cette méthode , qui prend une variable dbName
. Dans la documentation, il est indiqué If not provided, use database name from connection string.
, comme indiqué par @divillysausages dans les commentaires ci-dessous.
En bref, nous devrions appeler database.db().collection('theCollectionIwantToAccess');
si dbName est fourni par url, où database
est en réalité client
pour une meilleure compréhension.
L'erreur est dans la bibliothèque mongodb. Essayez d’installer la version 2.2.33
de mongodb
. Supprimez votre répertoire node_modules
et ajoutez
"dependencies": {
"mongodb": "^2.2.33"
}
Ensuite
npm install
et vous voilà
MongoClient.connect(uristring, function (err, database) {
var db=database.db('chatroomApp');
var collections=db.collection('chats');
});
Il faut d'abord obtenir la base de données avant d'essayer d'accéder aux collections.
Selon le document Mongo, nous devons changer la connexion ci-dessous,
The legacy operation
MongoClient.connect('mongodb://localhost:27017/test', (err, db) => {
// Database returned
});
is replaced with
MongoClient.connect('mongodb://localhost:27017/test', (err, client) => {
// Client returned
var db = client.db('test');
});
Pas besoin de déclasser la version Mongo :)
La désinstallation du paquet mongodb existant et la réinstallation à l'aide des commandes suivantes ont résolu les problèmes pour moi. :)
npm uninstall mongodb --save
npm install [email protected] --save
PS: Merci à @MihirBhende et @yaxartes
FYI,
Préférez les versions non-rc de https://github.com/mongodb/node-mongodb-native/releases , si vous êtes nouveau sur le terrain.
J'ai rencontré le même problème. Il semble que le module du pilote mongodb pour le noeud ait été mis à jour depuis la création de la vidéo. J'ai trouvé le code ci-dessous dans la documentation qui fonctionne.
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/<dbName>';
MongoClient.connect(url, (err, db) => {
db.collection('<collection-name>').find({}).toArray(function(err, docs) {
// Print the documents returned
docs.forEach(function(doc) {
console.log(doc);
});
// Close the DB
db.close();
});
});
est remplacé par
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017'; // remove the db name.
MongoClient.connect(url, (err, client) => {
var db = client.db(dbName);
db.collection('<collection-name>').find({}).toArray(function(err, docs) {
// Print the documents returned
docs.forEach(function(doc) {
console.log(doc);
});
// Close the DB
client.close();
});
});
Voici un link vers les derniers documents au cas où nous aurions des problèmes de syntaxe supplémentaires.
module.exports = function(app, db) {
app.post('/notes', (req, res) => {
const note = { text: req.body.body, title: req.body.title };
db.collection('notes').insert(note, (err, result) => {
...
db -> client
module.exports = function(app, client) {
var db = client.db("name");
app.post('/notes', (req, res) => {
const note = { text: req.body.body, title: req.body.title };
db.collection('notes').insert(note, (err, result) => {
...
Si j'avais eu ce problème aussi, je suivais un tutoriel dans lequel le présentateur utilisait la collection en tant que fonction. Cela n'a jamais fonctionné pour moi. Ce que j’ai découvert, c’est que le présentateur utilisait la version 2.3.4 du module mongodb npm. le module est bien dans la version 3.x.x maintenant. Lorsque j'ai modifié le fichier package.json pour demander la version 2.x.x du module mogodb npm, tout a fonctionné.
Ce que je croyais arrivé, c'est que le module a été modifié pour transformer la collection en un objet différent. Je ne sais pas comment utiliser la nouvelle version, mais si vous spécifiez que vous souhaitez utiliser la version 2.x.x, l'ancienne méthode devrait fonctionner. Plus précisément, je peux confirmer que (provenant de mon fichier package.json, section "dépendances") "mongodb": "^ 2.2.31" fonctionne.
Meilleur moyen:
$> npm install [email protected] --save
Dans votre package.json.
assurez-vous que les versions suivantes ressemblent à ceci:
"nodemon": "^1.12.1"
"mongodb": "^2.2.33"
les versions précédentes de nodemon et de mongodb fonctionnent ensemble sans erreur .. donc votre package.json devrait ressembler à ceci:
{
"name": "myapi",
"version": "1.0.0",
"description": "Json Api",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "nodemon server.js"
},
"author": "Riley Manda",
"license": "ISC",
"dependencies": {
"body-parser": "^1.18.2",
"express": "^4.16.2",
"mongodb": "^2.2.33"
},
"devDependencies": {
"nodemon": "^1.12.1"
}
}
n'oubliez pas de lancer npm install après la mise à niveau
Merci beaucoup à Dilum Darshana! Vos conseils ont beaucoup aidé. Je veux juste ajouter que si vous utilisez des promesses, cela ressemblera à ceci:
let db;
MongoClient.connect('mongodb://localhost/collectionName').then(connection => {
db = connection.db('collectionName');
app.listen(3000, () => {
console.log("App started on port 3000");
});
}).catch(error => {
console.log('ERROR:', error);
});
Code de travail utilisant:
npm version 6.0.1,
Node version 10.1.0
"body-parser": "^1.18.3",
"express": "^4.16.3",
"mongodb": "^3.1.0-beta4"
"nodemon": "^1.17.4"
Voici le code server.js
:
const express = require('express');
const MongoClient = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const db = require('./config/db');
const app = express();
const port = 8000;
app.use(bodyParser.urlencoded({ extended:true }))
MongoClient.connect(db.url, { useNewUrlParser: true }, (err, client)=>{
var db = client.db('notable');
if (err) return console.log(err)
require('./app/routes')(app, client);
app.listen(port,()=>{
console.log('we are live at '+ port);
});
})
Voici le code config/db.js
:
module.exports = {
url:"mongodb://127.0.0.1:27017"
}
Voici routes/note_routes.js
:
var ObjectId = require('mongodb').ObjectID;
module.exports= function (app, client) {
var db = client.db('notable');
//find One
app.get('/notes/:id', (req, res)=>{
const id =req.params.id;
const details ={'_id': new ObjectId(id)}
db.collection('notes').findOne(details, (err, item)=>{
if(err)
{
res.send({'error':"An error has occured"})
}
else
{
res.send(item)
}
});
});
//update rout
app.put('/notes/:id', (req, res)=>{
const id =req.params.id;
const details ={'_id': new ObjectId(id)}
const note ={text: req.body.body, title: req.body.title};
db.collection('notes').update(details, note, (err, item)=>{
if(err)
{
res.send({'error':"An error has occured"})
}
else
{
res.send(item)
}
});
});
//delete route
app.delete('/notes/:id', (req, res)=>{
const id =req.params.id;
const details ={'_id': new ObjectId(id)}
db.collection('notes').remove(details, (err, item)=>{
if(err)
{
res.send({'error':"An error has occured"})
}
else
{
res.send("Note "+id+"deleted!")
}
});
});
//insert route
app.post('/notes', (req, res)=>{
const note ={text: req.body.body, title: req.body.title};
db.collection('notes').insert(note, (err, results)=>{
if(err)
{
res.send({'error':"An error has occured"})
}
else
{
res.send(results.ops[0])
}
});
});
};
Ne pas utiliser le nom de la base de données dans l'URL de connexion:
const mongo_url = 'mongodb://localhost:27017'
Utilisez plutôt la méthode ci-dessous:
MongoClient.connect(mongo_url , { useNewUrlParser: true }, (err, client) => {
if (err) return console.log(err)
const db = client.db('student')
const collection = db.collection('test_student');
console.log(req.body);
collection.insertOne(req.body,(err,result)=>{
if(err){
res.json(err);
}
res.json(result);
});
});
const MongoClient = require('mongodb').MongoClient;
//connection url
const url = 'mongodb://localhost:27017/myproject';
MongoClient.connect(url,{useNewUrlParser: true},(err,client)=> {
if(err) {
return console.dir(err)
}
console.log('Connected to MongoDB')
//get the collection
let db = client.db('myproject');
db.collection('users').insertOne({
name: 'Hello World',
email: '[email protected]'
},(err,result)=> {
if(err) {
return console.dir(err)
}
console.log("Inserted Document");
console.log(result);
});
});
J'ai une solution simple:
note_routes.js
db.collection('notes').insert(note, (err, result) => {
remplacer
db.db().collection('notes').insert(note, (err, result) => {