Ich versuche, Daten in einer Datenbank zu veröffentlichen, die ich auf mLab erstellt habe, und es wird dieser Fehler angezeigt, aber ich weiß nicht, was falsch läuft. Ich habe auch zuvor gestellte Fragen zu diesem Thema gelesen, kann meinen Fehler jedoch nicht als beheben Ich bin neu in diesem Bereich. Hier veröffentliche ich den Code, den ich implementieren möchte, und er stammt aus diesem Tutorial 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]);
}
});
});
};
db
- benötigen Sie es?Antworten:
In Ihrer Datei server.js übergeben Sie ein leeres Objekt, an das Sie die Datenbank als zweites Argument übergeben müssen, wie es Ihre Exportfunktion routen / index.js erwartet.
PFB aktualisiert 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); }); });
quelle
Also habe ich für die Antwort gestimmt, die besagt, dass ich nur zu Mongodb 2.2.33 gehen soll, weil ich es ausprobiert habe und es funktioniert hat, aber dann fühlte ich mich komisch, nur ein Downgrade durchzuführen, um ein Problem zu beheben, also habe ich die Lösung gefunden, mit der Sie die Version> = behalten können 3.0. Wenn jemand dieses Problem findet und sein Problem nicht in einer leeren Referenz wie der akzeptierten Antwort übergeben wurde, probieren Sie diese Lösung aus.
Wenn du rennst ..
MongoClient.connect(db.url,(err,database) =>{ }
In der Mongodb-Version> = 3.0 ist diese
database
Variable tatsächlich das übergeordnete Objekt des Objekts, auf das Sie zugreifen möchtendatabase.collection('whatever')
. Um auf das richtige Objekt zugreifen zu können, müssen Sie Ihren Datenbanknamen referenzierenMongoClient.connect(db.url,(err,database) =>{ const myAwesomeDB = database.db('myDatabaseNameAsAString') myAwesomeDB.collection('theCollectionIwantToAccess') }
Dies hat meine Fehler beim Ausführen meines node.js-Servers behoben. Hoffentlich hilft dies jemandem, der nicht nur seine Version herunterstufen möchte.
(Wenn Sie Ihren Datenbanknamen aus irgendeinem Grund nicht kennen, erstellen Sie einfach eine console.log (Datenbank) und Sie sehen sie als Objektattribut.)
EDIT (Juni 2018):
Nach diesem kehrt der Rückruf tatsächlich den angeschlossenen Client aus der Datenbank, anstatt die Datenbank selbst.
Um die Datenbankinstanz zu erhalten, müssen wir daher diese Methode verwenden , die a akzeptiert
dbName
. In der Dokumentation heißt esIf not provided, use database name from connection string.
, wie von @divillysausages in den Kommentaren unten erwähnt.Kurz gesagt, wir sollten aufrufen,
database.db().collection('theCollectionIwantToAccess');
ob der Datenbankname über die URL bereitgestellt wird, wobei der Namedatabase
tatsächlichclient
zum besseren Verständnis dientquelle
mongodb://localhost:27107/MyDB
, dann wird es als Standard für die zurück MongoClient eingestellt werden (database
in diesem Beispiel) Auf diese Weise können Sie anrufen.database.db()
Die tatsächliche DB zu bekommenDer Fehler liegt in der Mongodb-Bibliothek. Versuchen Sie, die Version
2.2.33
von zu installierenmongodb
. Löschen Sie Ihrnode_modules
Verzeichnis und fügen Sie hinzu"dependencies": { "mongodb": "^2.2.33" }
Dann
und da bist du
quelle
npm install mongodb --save
great catch @yaxartes installiertMongoClient.connect(uristring, function (err, database) { var db=database.db('chatroomApp'); var collections=db.collection('chats'); });
Sie müssen zuerst die Datenbank abrufen, bevor Sie versuchen, auf die Sammlungen zuzugreifen.
quelle
Laut dem Mongo-Dokument müssen wir die Verbindung wie folgt ändern:
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'); });
Die Mongo-Version muss nicht heruntergestuft werden :)
quelle
Das Deinstallieren des vorhandenen Mongodb-Pakets und die Neuinstallation mit den folgenden Befehlen haben die Probleme für mich behoben. :) :)
npm uninstall mongodb --save npm install mongodb@2.2.33 --save
PS: Danke an @MihirBhende und @yaxartes
Zu Ihrer Information,
Bevorzugen Sie Nicht-RC-Releases von https://github.com/mongodb/node-mongodb-native/releases , wenn Sie neu auf dem Gebiet sind.
quelle
Ich bin auf dasselbe Problem gestoßen. Es sieht so aus, als ob das Mongodb-Treibermodul für den Knoten seit der Erstellung des Videos aktualisiert wurde. Ich habe den folgenden Code in den Dokumenten gefunden, der funktioniert.
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(); }); });
wird ersetzt durch
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(); }); });
Hier ist ein Link zu den neuesten Dokumenten, falls wir auf weitere Syntaxprobleme stoßen.
quelle
Für die aktuelle Version, die ich verwendet habe, hat der folgende
"mongodb": "^3.1.3"
Code mein Problem gelöstim
server.js
MongoCLient.connect(db.url,(err,client)=>{ var db=client.db('notable123'); if(err){ return console.log(err); } require('./server-app/routes')(app,db); app.listen(port, ()=> { console.log("we are live on : "+ port); }) })
und deine Postleitzahl ist wie
module.exports = function(app,db) { app.post('/notes',(req,res)=>{ const note= {text: req.body.body,title:req.body.title}; db.collection('notes').insertOne(note,(err,result)=>{ if(err) { res.send({"error":"Ann error has occured"}); } else { res.send(result.ops[0]) } }); }); };
quelle
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) => { ...
quelle
Vielen Dank an Dilum Darshana! Ihr Rat hat sehr geholfen. Ich möchte nur hinzufügen, dass, wenn Sie Versprechen verwenden, es so aussieht:
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); });
quelle
In Ihrer package.json.
Stellen Sie sicher, dass die folgenden Versionen folgendermaßen aussehen:
"nodemon": "^1.12.1" "mongodb": "^2.2.33"
Die oben genannten Versionen von nodemon und mongodb arbeiten fehlerfrei zusammen. Ihre package.json sollte also ungefähr so aussehen:
{ "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" } }
Vergessen Sie nicht, npm install nach dem Downgrade auszuführen
quelle
Hatte auch dieses Problem, folgte ich einem Tutorial, in dem der Moderator die Sammlung als Funktion verwendete. Bei mir hat es nie funktioniert. Was ich entdeckte, war, dass der Moderator Version 2.3.4 des mongodb npm-Moduls verwendete. Das Modul ist jetzt weit in Version 3.xx. Als ich die Datei package.json änderte, um die 2.xx-Version des mogodb npm-Moduls anzufordern, funktionierte plötzlich alles.
Was ich glaubte, war, dass das Modul geändert wurde, um die Sammlung in ein anderes Objekt zu ändern. Ich weiß nicht, wie ich die neue Version verwenden soll, aber wenn Sie angeben, dass Sie die 2.xx-Version möchten, sollte die alte Methode funktionieren. Insbesondere kann ich bestätigen, dass (aus meiner package.json-Datei, Abschnitt "Abhängigkeiten") "mongodb": "^ 2.2.31" funktioniert.
Bester Weg:
$> npm install mongodb@2.2.31 --save
quelle
MongoClient.connect(db.url,(err,database) =>{ if (err) return console.log(err) //require('./app/routes')(app,{}); //try this require('./app/routes')(app,database); app.listen(port,() => { console.log("We are live on"+port); }); })
Hier müssen Sie die Datenbank in das leere {} aufnehmen.
oder
Sie können auch versuchen, mongodb auf dem neuesten Stand zu installieren, um das Problem zu beheben.
npm install mongodb@2.2.33 --save
sonst npm install add Abhängigkeit von "mongodb": "^ 2.2.33" in Knotenmodulen.
quelle
Arbeitscode mit:
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"
Hier ist
server.js
Code: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); }); })
Hier ist
config/db.js
Code:module.exports = { url:"mongodb://127.0.0.1:27017" }
Hier ist
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]) } }); }); };
quelle
Verwenden Sie den Datenbanknamen nicht in der Verbindungs-URL:
const mongo_url = 'mongodb://localhost:27017'
Verwenden Sie stattdessen die folgende Methode:
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); }); });
quelle
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); }); });
quelle
Ich habe eine einfache Lösung:
note_routes.js
db.collection('notes').insert(note, (err, result) => {
ersetzen
db.db().collection('notes').insert(note, (err, result) => {
quelle
Ich mache das gleiche Tutorial mit dem gleichen Problem. Ich habe gerade alle Antworten überprüft und die für mich gefunden.
MongoClient.connect(db.url, { useUnifiedTopology: true }, (err, client) => { var database = client.db('test'); if (err) return console.log(err) require('./app/routes')(app, database); app.listen(port, () => { console.log('We are live on ' + port);}); })
Datenbank in Client geändert und Datenbank als client.db definiert ('test')
quelle