Ich versuche, Daten in einer Datenbank zu veröffentlichen, die ich auf mLab erstellt habe, und ich bekomme diesen Fehler. Ich weiß jedoch nicht, was schief läuft Ich bin neu in diesem Bereich. Also poste ich hier 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- Minuten-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]);
}
});
});
};
In Ihrer server.js übergeben Sie ein leeres Objekt, bei dem Sie die Datenbank als zweites Argument übergeben müssen, wie es die Exportfunktion von routes/index.js erwartet.
PFB aktualisierte 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);
});
});
Also habe ich für die Antwort gestimmt, die besagte, ich solle einfach auf mongodb 2.2.33 runtergehen, weil ich es ausprobiert habe und es hat funktioniert, aber dann kam es mir seltsam vor, ein Downgrade durchzuführen, um ein Problem zu beheben, also habe ich die Lösung gefunden, die es Ihnen ermöglicht, Version> = 3,0. Wenn jemand dieses Problem findet und sein Problem keine leere Referenz wie die akzeptierte Antwort enthielt, probieren Sie diese Lösung aus.
Wenn du rennst ..
MongoClient.connect(db.url,(err,database) =>{ }
In der mongodb-Version> = 3.0 ist diese Variable database
tatsächlich das übergeordnete Objekt des Objekts, auf das Sie mit database.collection('whatever')
zugreifen möchten. Um auf das richtige Objekt zuzugreifen, müssen Sie auf Ihren Datenbanknamen verweisen
MongoClient.connect(db.url,(err,database) =>{
const myAwesomeDB = database.db('myDatabaseNameAsAString')
myAwesomeDB.collection('theCollectionIwantToAccess')
}
Dies behebte meine Fehler beim Ausführen meines node.js-Servers. Hoffentlich hilft dies jemandem, der nicht nur seine Version herunterstufen möchte.
(Wenn Sie Ihren Datenbanknamen aus irgendeinem Grund nicht kennen, führen Sie einfach eine Konsole.log (Datenbank) aus, und Sie werden sie als Objektattribut sehen.)
EDIT (Juni 2018):
Gemäß this gibt der Rückruf tatsächlich den verbundenen Client der Datenbank statt der Datenbank selbst zurück.
Um die Datenbankinstanz zu erhalten, müssen wir diese Methode verwenden, die ein dbName
enthält. In der Dokumentation stand If not provided, use database name from connection string.
, wie von @divillysausages in den Kommentaren erwähnt.
Kurz gesagt, sollten wir database.db().collection('theCollectionIwantToAccess');
aufrufen, wenn der Datenbankname von url angegeben wird, wobei database
tatsächlich client
ist, um das Verständnis zu erleichtern
Der Fehler befindet sich in der Mongodb-Bibliothek. Versuchen Sie, die Version 2.2.33
von mongodb
zu installieren. Löschen Sie Ihr node_modules
-Verzeichnis und fügen Sie hinzu
"dependencies": {
"mongodb": "^2.2.33"
}
Dann
npm install
und da bist du
MongoClient.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.
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 :)
Durch die Deinstallation des vorhandenen mongodb-Pakets und die Neuinstallation mit den folgenden Befehlen wurden die Probleme behoben. :)
npm uninstall mongodb --save
npm install [email protected] --save
PS: Danke an @MihirBhende und @yaxartes
FYI,
Bevorzugen Sie Nicht-RC-Releases von https://github.com/mongodb/node-mongodb-native/releases , wenn Sie noch nicht mit dem Feld vertraut sind.
Ich bin auf die gleiche Ausgabe gestoßen. Das mongodb-Treibermodul für den Knoten wurde seit der Erstellung des Videos aktualisiert. 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 durch ersetzt
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 weitere Syntaxprobleme auftreten.
In der letzten Version habe ich "mongodb": "^3.1.3"
Der folgende Code hat mein Problem gelöst
im 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 Ihre 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])
}
});
});
};
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) => {
...
Hatte dieses Problem auch, folgte ich einem Tutorial, in dem der Moderator die Sammlung als Funktion verwendete. Es hat nie für mich funktioniert. Was ich entdeckte, war, dass der Moderator Version 2.3.4 des mongodb-npm-Moduls verwendete. Das Modul ist jetzt in Version 3.x.x. Als ich die package.json-Datei geändert habe, um die 2.x.x-Version des mogodb-npm-Moduls anzufordern, funktionierte plötzlich alles.
Ich glaubte, dass das Modul geändert wurde, um die Sammlung in ein anderes Objekt umzuwandeln. Sie können die neue Version nicht verwenden, aber wenn Sie angeben, dass Sie die 2.x.x-Version verwenden möchten, sollte die alte Version funktionieren. Konkret kann ich bestätigen, dass "mongodb" (aus meiner package.json-Datei, Abschnitt "Abhängigkeiten") "^ 2.2.31" funktioniert.
Bester Weg:
$> npm install [email protected] --save
In Ihrem package.json.
stellen Sie sicher, dass die folgenden Versionen so aussehen:
"nodemon": "^1.12.1"
"mongodb": "^2.2.33"
die obigen Versionen von nodemon und mongodb arbeiten ohne Fehler zusammen Ihr package.json sollte daher etwa 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
Vielen Dank an Dilum Darshana! Dein Rat hat sehr geholfen. Ich möchte nur hinzufügen, dass, wenn Sie Versprechen verwenden, es so aussehen wird:
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);
});
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])
}
});
});
};
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);
});
});
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);
});
});
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) => {