не удается прочитать свойство undefined при вызове метода в коллекции mongodb

#mongodb #export #database

#mongodb #экспорт #База данных

Вопрос:

Я пытаюсь разработать базовую инфраструктуру вызова post ajax, чтобы сохранить что-то в моей базе данных, в коллекции с именем ‘ranges’.

  1. Когда я просто запускаю node connection.js Я получаю «Не удается прочитать ‘диапазоны’ свойств undefined», я неправильно создал эту коллекцию?

  2. Необходимо ли создавать его перед вставкой? Я где-то читал, что MongdoDB должен создать коллекцию для вас, если она не существует.

  3. Должен ли я db.close () мою функцию подключения в какой-то момент?

  4. Когда я экспортирую базу данных, автоматически ли она экспортирует ссылку на коллекцию под ней?

connection.js

 MongoClient = require('mongodb').MongoClient,
Server = require('mongodb').Server;
var url = 'mongodb://localhost:27017/test';
var db = MongoClient.connect(url, function (err, db) {
if (err) {
  console.log('Unable to connect to the mongoDB server. Error:', err);
} else {
  console.log('Connection established to', url);
  db.createCollection("ranges");

}});

doSomething = function() {
db.ranges.insert ({"hello" : "world"});
};

module.exports = db;
  

app.js

 var express = require('express');
cors = require('cors');
var app = express();
app.use('/', express.static('/public'));
app.use(cors());
var db = require('./connection');

app.get('/', function(req, res){
res.send('Got a GET request');
 });

app.post('/', function(req, res){
res.send('Got a POST request');

});


app.listen(3000,function(){
console.log("Server started successfully at Port 3000!");
});
  

Ответ №1:

1 — db не определено, потому что, поскольку вы не ждете, пока соединение будет готово перед его экспортом. Возможно, было бы лучше подключиться после запроса базы данных, чтобы иметь возможность выполнять действия после обратного вызова

Кроме того, createCollection это асинхронная операция, поэтому вы, вероятно, вызываете метод insert до того, как он будет создан. Вы должны сделать что-то вроде:

 db.createCollection("ranges", function(err, collection){
    collection.insert({"hello" : "world"});
});
  

Но если ranges коллекция уже создана, у вас не должно возникнуть проблем.

2 — Mongo создаст коллекции для вас, когда вы вставляете в них документы, но иногда вы можете столкнуться с ошибками, подобными той, с которой вы столкнулись, поскольку коллекция не существует, у вас будут нулевые ссылки.(Теперь я не уверен, достаточно ли умен драйвер, чтобы создать его для вас, если его там нет)

3 — Хотя это не совсем необходимо, иногда полезно закрыть соединение. Обычно я делаю это при получении SIGTERM или SIGINT . Смотрите пример:

 process.on('SIGTERM', function() {
  db.close()
  process.exit(0);
});
  

4 — Да, но сначала убедитесь, что они создаются (помните из первого пункта, что это асинхронная операция)

(Еще один совет, проверьтеmongoose, возможно, это упростит задачу)

Комментарии:

1. 1. Я проверил свою базу данных, и у меня есть коллекция «ranges», созданная до того, как я вызвал функцию doSomething, чтобы вставить в нее свой документ.

2. Хммм, присмотревшись получше к вашему коду, я вижу, что вызывается модуль.exports, но процесс подключения к базе данных асинхронный. Я обновлю свой ответ

3. Хорошо, вы внесли изменения. Теперь это работает (я проголосовал за, но у меня недостаточно точки репутации для его отображения).

4. Неплохо. О, хорошо, пожалуйста, можете ли вы принять это тогда? (Символ проверки под голосами)