在集合mongodb上调用方法时无法读取undefined的属性

在集合mongodb上调用方法时无法读取undefined的属性,mongodb,export,database,Mongodb,Export,Database,我正在尝试建立一个后ajax调用的基本基础结构,以便在名为“ranges”的集合下将某些内容保存到我的数据库中 当我运行node connection.js时,我得到 “无法读取未定义的属性‘范围’”,我是否创建了错误的集合 插入前是否需要创建它?我在某个地方读到,如果MongdoDB不存在,它应该为您创建集合 我应该在某个时候关闭我的连接函数吗 当我导出DB时,它是否会自动导出对它下面集合的引用 connection.js MongoClient = require('mongodb').Mo

我正在尝试建立一个后ajax调用的基本基础结构,以便在名为“ranges”的集合下将某些内容保存到我的数据库中

  • 当我运行node connection.js时,我得到 “无法读取未定义的属性‘范围’”,我是否创建了错误的集合

  • 插入前是否需要创建它?我在某个地方读到,如果MongdoDB不存在,它应该为您创建集合

  • 我应该在某个时候关闭我的连接函数吗

  • 当我导出DB时,它是否会自动导出对它下面集合的引用

  • 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;
    
    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!");
    });
    
    app.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;
    
    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-
    db
    未定义,因为您在导出连接之前没有等待连接就绪。为了能够在回调后执行操作,最好在需要db之后进行连接

    此外,
    createCollection
    是一个异步操作,因此您可能在创建insert方法之前调用它。你应该这样做:

    db.createCollection("ranges", function(err, collection){
        collection.insert({"hello" : "world"});
    });
    
    但是如果已经创建了
    范围
    集合,则应该没有问题

    2-Mongo将在您向其中插入文档时为您创建集合,但有时您可能会出现错误,如您正在创建的集合,因为集合不存在,您将有空引用。(现在我不确定驱动程序是否足够智能,如果不存在,是否可以为您创建它)

    3-虽然不是完全必要,但有时关闭连接是好的。我通常在收到
    SIGTERM
    SIGINT
    时这样做。见示例:

    process.on('SIGTERM', function() {
      db.close()
      process.exit(0);
    });
    
    4-是的,但确保首先创建它们(记住从第一项开始,这是一个异步操作)


    (另一个提示,检查,也许这会让事情变得更简单)

    1-
    db
    未定义,因为您不需要等待连接准备好再导出它。为了能够在回调后执行操作,最好在需要db之后进行连接

    此外,
    createCollection
    是一个异步操作,因此您可能在创建insert方法之前调用它。你应该这样做:

    db.createCollection("ranges", function(err, collection){
        collection.insert({"hello" : "world"});
    });
    
    但是如果已经创建了
    范围
    集合,则应该没有问题

    2-Mongo将在您向其中插入文档时为您创建集合,但有时您可能会出现错误,如您正在创建的集合,因为集合不存在,您将有空引用。(现在我不确定驱动程序是否足够智能,如果不存在,是否可以为您创建它)

    3-虽然不是完全必要,但有时关闭连接是好的。我通常在收到
    SIGTERM
    SIGINT
    时这样做。见示例:

    process.on('SIGTERM', function() {
      db.close()
      process.exit(0);
    });
    
    4-是的,但确保首先创建它们(记住从第一项开始,这是一个异步操作)


    (另一个提示,检查一下,也许这会让事情变得更简单)

    1。在调用doSomething函数将文档插入数据库之前,我检查了我的数据库并创建了“ranges”集合。嗯,我仔细查看了您的代码,我看到调用了module.exports,但数据库连接过程是异步的。我会更新我的答案好的,你已经改变了。它现在可以工作了(我投了更高的票,但我没有足够的声望点来展示)。很好。哦,好的,那你能接受吗?(表决票下方的复选符号)1。在调用doSomething函数将文档插入数据库之前,我检查了我的数据库并创建了“ranges”集合。嗯,我仔细查看了您的代码,我看到调用了module.exports,但数据库连接过程是异步的。我会更新我的答案好的,你已经改变了。它现在可以工作了(我投了更高的票,但我没有足够的声望点来展示)。很好。哦,好的,那你能接受吗?(选票下方的复选符号)