TypeError: db.collection не является функцией
Я пытаюсь отправить данные в базу данных, которые я создал на mLab, и я получаю эту ошибку, но я не знаю, что происходит. Я также прочитал ранее заданный вопрос по этой теме, но я не могу решить моя ошибка, поскольку я новичок в этом. Поэтому здесь я отправляю код, который я пытаюсь реализовать, и взято из этого учебника 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]);
}
});
});
};
Ответы
Ответ 1
В вашем server.js вы передаете пустой объект, где вам нужно передать базу данных в качестве второго аргумента, как это ожидает ваша экспортная функция route/index.js.
PFB обновил 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);
});
});
Ответ 2
Поэтому я проголосовал за ответ, в котором говорилось, что нужно перейти на mongodb 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')
}
Это исправило мои ошибки при запуске моего сервера node.js, надеюсь, это поможет кому-то, кто не хочет просто понизить версию.
(также, если вы по какой-то причине не знаете своего имени БД, просто сделайте console.log (база данных), и вы увидите его как атрибут объекта)
РЕДАКТИРОВАТЬ (июнь 2018 года):
Согласно этому, обратный вызов фактически возвращает подключенного клиента базы данных, а не саму базу данных.
Поэтому, чтобы получить экземпляр базы данных, нам нужно использовать этот метод, который принимает dbName
. В документации сказано, что If not provided, use database name from connection string.
, как упомянуто @divillysausages в комментариях ниже.
Короче говоря, мы должны вызвать database.db().collection('theCollectionIwantToAccess');
если dbName предоставлено url, где database
на самом деле является client
для лучшего понимания
Ответ 3
Ошибка в библиотеке mongodb. Попробуйте установить версию 2.2.33
из mongodb
. Удалите каталог node_modules
и добавьте
"dependencies": {
"mongodb": "^2.2.33"
}
Тогда
npm install
и там вы
Ответ 4
MongoClient.connect(uristring, function (err, database) {
var db=database.db('chatroomApp');
var collections=db.collection('chats');
});
Прежде чем пытаться получить доступ к коллекциям, сначала необходимо получить базу данных.
Ответ 5
Согласно документу Монго, нам нужно изменить соединение, как показано ниже,
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');
});
Не нужно понижать версию Монго :)
Ответ 6
Удаление существующего пакета mongodb и переустановка с помощью следующих команд позволили решить проблемы для меня.:)
npm uninstall mongodb --save
npm install [email protected] --save
PS: Благодаря @MihirBhende и @yaxartes
FYI,
Предпочитайте не-rc-релизы из https://github.com/mongodb/node-mongodb-native/releases, если вы новичок в этом поле.
Ответ 7
Я столкнулся с той же проблемой. Похоже, что модуль драйвера mongodb для узла был обновлен с момента создания видео. Я нашел код ниже в документации, которая работает.
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();
});
});
Вот ссылка на последние документы на случай, если возникнут дальнейшие проблемы с синтаксисом.
Ответ 8
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 → клиент
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) => {
...
Ответ 9
Для последней версии я использовал "mongodb": "^3.1.3"
Ниже код решил мою проблему
в 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);
})
})
и ваш почтовый индекс похож
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])
}
});
});
};
Ответ 10
В вашем пакете .json.
убедитесь, что следующие версии выглядят так:
"nodemon": "^1.12.1"
"mongodb": "^2.2.33"
Указанные выше версии nodemon и mongodb работают без ошибок. поэтому ваш package.json должен выглядеть примерно так:
{
"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 после понижения
Ответ 11
Если бы у меня была эта проблема, я следовал учебному пособию, в котором докладчик использовал коллекцию как функцию. Это никогда не работало для меня. Я обнаружил, что докладчик использовал версию 2.3.4 модуля mongodb npm. модуль хорошо в версии 3.xx сейчас. Когда я изменил файл package.json для запроса версии 2.xx модуля mogodb npm, вдруг все заработало.
Я верил, что модуль был изменен, чтобы изменить коллекцию на другой объект. Не знаю, как использовать новую версию, но если вы укажете, что хотите версию 2.xx, старый способ должен работать. В частности, я могу подтвердить, что (исходя из моего файла package.json, раздел "зависимости") "mongodb": "^ 2.2.31" работает.
Лучший способ:
$> npm install [email protected] --save
Ответ 12
Рабочий код с использованием:
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])
}
});
});
};
Ответ 13
Большое спасибо Дилум Даршана! Ваш совет очень помог. Я просто хочу добавить, что, если вы используете обещания, это будет выглядеть так:
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);
});
Ответ 14
Не используйте имя базы данных в 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);
});
});
Ответ 15
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);
});
});
Ответ 16
У меня есть простое решение:
note_routes.js
db.collection('notes').insert(note, (err, result) => {
замещать
db.db().collection('notes').insert(note, (err, result) => {