node.js - TypeError: db.collection एक फंक्शन नहीं है




mongodb rest (11)

मैं उस डेटाबेस पर डेटा पोस्ट करने की कोशिश कर रहा हूं जो मैंने mLab पर बनाया है और मुझे यह त्रुटि मिल रही है, लेकिन मुझे पता नहीं है कि क्या गलत हो रहा है। मैंने इस विषय पर पहले पूछे गए प्रश्न भी पढ़े हैं लेकिन मैं अपनी त्रुटि को हल करने में सक्षम नहीं हूं यह मेरे लिए नया है। इसलिए यहां मैं वह कोड पोस्ट कर रहा हूं जिसे मैं लागू करने की कोशिश कर रहा हूं और इसे इस ट्यूटोरियल https://medium.freecodecamp.com/building-a-simple-node-js-api-in-under-30-minutes-a07ea9e390d2 से लिया गया है 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]);
      }
    });
  });
};

अपने server.js में, आप खाली ऑब्जेक्ट पास कर रहे हैं जहाँ आपको डेटाबेस को दूसरे तर्क के रूप में पारित करने की आवश्यकता है क्योंकि इसके मार्ग / index.js निर्यात फ़ंक्शन की अपेक्षा करते हैं।

PFB अपडेट किया गया सर्वर ।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); 
    });

});

अपने पैकेज में। Json।

सुनिश्चित करें कि निम्न संस्करण इस तरह दिखते हैं:

"nodemon": "^1.12.1"
"mongodb": "^2.2.33"

उपरोक्त नोडम और मोंगोडब संस्करण बिना किसी त्रुटि के एक साथ काम करते हैं। इसलिए आपका पैकेज.जॉन को कुछ इस तरह दिखना चाहिए:

    {
  "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"
  }
}

उन्नयन के बाद npm स्थापित चलाने के लिए मत भूलना


इसलिए मैंने उस उत्तर के लिए मतदान किया जिसने कहा था कि बस नीचे मूंगोडब 2.2.33 पर जाएं क्योंकि मैंने इसे आज़माया और यह काम किया, लेकिन फिर मुझे एक समस्या को ठीक करने के लिए अपग्रेड करने के बारे में अजीब लगा, इसलिए मुझे समाधान मिला जो आपको संस्करण> रखने की अनुमति देता है = = 3.0। यदि किसी को यह समस्या मिलती है और उनकी समस्या स्वीकार किए गए उत्तर की तरह एक रिक्त संदर्भ में पारित नहीं हो रही है, तो इस समाधान को आज़माएं।

जब तुम दौड़ते हो ।।

MongoClient.connect(db.url,(err,database) =>{ }

Mongodb संस्करण> = 3.0 में, वह database चर वास्तव में उस ऑब्जेक्ट की मूल वस्तु है जिसे आप database.collection('whatever') साथ एक्सेस करने का प्रयास कर रहे हैं। सही ऑब्जेक्ट को एक्सेस करने के लिए, आपको अपने डेटाबेस के नाम का संदर्भ देने की आवश्यकता है, जो मेरे लिए था

MongoClient.connect(db.url,(err,database) =>{ 
  const myAwesomeDB = database.db('myDatabaseNameAsAString')
  myAwesomeDB.collection('theCollectionIwantToAccess')
}

मेरे नोड.जेएस सर्वर को चलाते समय यह मेरी त्रुटियों को ठीक करता है, उम्मीद है कि यह किसी ऐसे व्यक्ति की मदद करता है जो अपने संस्करण को डाउनग्रेड नहीं करना चाहता है।

(यह भी, यदि आप किसी कारण से अपना डीबी नाम नहीं जानते हैं, तो बस एक कंसोल करें। डेटाबेस (डेटाबेस) और आप इसे ऑब्जेक्ट विशेषता के रूप में देखेंगे)

EDIT (जून 2018):

इसके अनुसार, कॉलबैक वास्तव में डेटाबेस के बजाय डेटाबेस के जुड़े हुए क्लाइंट को वापस करता है।

इसलिए, डेटाबेस का उदाहरण प्राप्त करने के लिए, हमें इस पद्धति का उपयोग करने की आवश्यकता है, जो एक dbName में लेता है। प्रलेखन में यह कहा गया है कि If not provided, use database name from connection string. , जैसा कि नीचे टिप्पणी में @divillysausages द्वारा उल्लेख किया गया है।

संक्षेप में, हमें database.db().collection('theCollectionIwantToAccess'); को कॉल करना चाहिए database.db().collection('theCollectionIwantToAccess'); अगर dbName url द्वारा प्रदान किया जाता है, जहां database वास्तव में बेहतर समझ के लिए client


कार्य कोड का उपयोग कर:

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"

यहाँ 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);
    });
})

यहाँ config/db.js कोड है:

module.exports = {
    url:"mongodb://127.0.0.1:27017"
}

यहां 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])
                    }
                });

            });
        };

दिलुम दर्शन को बहुत बहुत धन्यवाद! आपकी सलाह से बहुत मदद मिली। मैं सिर्फ यह जोड़ना चाहता हूं कि यदि आप वादों का उपयोग करते हैं तो यह इस तरह दिखाई देगा:

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);
});

मैं उसी मुद्दे में भाग गया। ऐसा लगता है कि वीडियो बनाने के बाद से नोड के लिए मोंगॉडब ड्राइवर मॉड्यूल अपडेट किया गया था। मुझे डॉक्स में नीचे दिया गया कोड काम करता है।

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();
    });

});  

के साथ बदल दिया गया है

 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();
        });

    });  

यदि हम आगे के सिंटैक्स मुद्दों में चलते हैं, तो नवीनतम डॉक्स की एक link यहां दी गई है।


मोंगो दस्तावेज के अनुसार, हमें कनेक्शन को बलो के रूप में बदलना होगा,

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');
});

मोंगो संस्करण को अपग्रेड करने की आवश्यकता नहीं है :)


मौजूदा mongodb पैकेज को अनइंस्टॉल करना और निम्नलिखित कमांड्स का उपयोग करके पुन: स्थापित करना मेरे लिए समस्याओं को हल करता है। :)

npm uninstall mongodb --save

npm install [email protected].2.33 --save

PS: @MihirBhende और @yaxartes को धन्यवाद

FYI करें,

यदि आप फ़ील्ड में नए हैं, तो https://github.com/mongodb/node-mongodb-native/releases से गैर-आरसी रिलीज़ को प्राथमिकता दें।


कनेक्शन url में डेटाबेस नाम का उपयोग न करें:

const mongo_url = 'mongodb://localhost:27017'

इसके बजाय नीचे विधि का उपयोग करें:

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);

     });
   });

MongoClient.connect(uristring, function (err, database) {
      var db=database.db('chatroomApp');
      var collections=db.collection('chats');
});

संग्रह को एक्सेस करने का प्रयास करने से पहले डेटाबेस प्राप्त करना आवश्यक है।





express