繁体   English   中英

node.js应用程序-如何通过include连接到mongodb和“共享”连接?

[英]node.js application - how to connect to mongodb and “share” connection via an include?

背景资料

我正在尝试我的第一个node.js API /应用程序。 作为一项学习练习,我试图创建一些测试用例,首先删除表中的所有记录,插入3条特定记录,然后查询这3条记录。

这是我拼凑的代码:

http://pastebin.com/duQQu3fm

问题

从代码中可以看到,我正在尝试将数据库连接逻辑放在dbSession.js文件中并传递它。

我可以通过执行以下操作来启动http服务器:

dev@devbox:~/nimble_node$ sudo nodejs src/backend/index.js 
Server started and listening on port: 8080
Database connection successful

但是,当我尝试运行茉莉花测试时,它失败并显示以下错误:

F

Failures:

  1) The API should respond to a GET request at /api/widgets/
   Message:
     TypeError: Object #<MongoClient> has no method 'collection'
   Stacktrace:
     TypeError: Object #<MongoClient> has no method 'collection'
    at resetDatabase (/home/dev/nimble_node/spec/resetDatabase.js:6:29)
    at /home/dev/nimble_node/spec/e2e/apiSpec.js:23:25
    at /home/dev/nimble_node/node_modules/async/lib/async.js:683:13
    at iterate (/home/dev/nimble_node/node_modules/async/lib/async.js:260:13)
    at async.forEachOfSeries.async.eachOfSeries (/home/dev/nimble_node/node_modules/async/lib/async.js:279:9)
    at _parallel (/home/dev/nimble_node/node_modules/async/lib/async.js:682:9)
    at Object.async.series (/home/dev/nimble_node/node_modules/async/lib/async.js:704:9)
    at null.<anonymous> (/home/dev/nimble_node/spec/e2e/apiSpec.js:19:9)
    at null.<anonymous> (/home/dev/nimble_node/node_modules/jasmine-node/lib/jasmine-node/async-callback.js:45:37)

Finished in 0.01 seconds
1 test, 1 assertion, 1 failure, 0 skipped


Database connection successful

resetDatabase的第6行是:

 var collection = dbSession.collection('widgets');

鉴于出现错误后,我收到“数据库连接成功”消息,我认为发生的事情是,当测试请求dbSession库时,数据库尚未完成运行代码的连接。 因此,我无法获取集合对象。

我目前正在阅读mongodb在线手册,以了解是否可以找到有关如何执行此类操作的提示。 任何建议或指示,将不胜感激。

编辑1

为了证明MongoClient对象上有一个收集方法,我将dbSession.js代码更改为如下所示:

'use strict';

var DBWrapper = require('mongodb').MongoClient;
var dbWrapper = new DBWrapper;
dbWrapper.connect("mongodb://localhost:27017/test", function(err, db) {
        if (!err) {
                console.log("Database connection successful");
                dbWrapper = db;
                var collection = dbWrapper.collection('widgets');
                console.log('just created a collection...');
        }
});
module.exports = dbWrapper;

现在,当我启动http服务器(index.js)时,请注意以下消息:

dev@devbox:~/nimble_node$ sudo nodejs src/backend/index.js 
Server started and listening on port: 8080
Database connection successful
just created a collection...

这可能是一个异步问题。

您在dbSessionjs中的代码

dbWrapper.connect("mongodb://localhost:27017/test", function(err, db) {
        if (!err) {
                console.log("Database connection successful");
                dbWrapper = db;
        }
});
module.exports = dbWrapper;

异步启动dbWrapper的连接,但立即导出dbWrapper,然后将其导入resetDatabase中。 因此,是的,当您在resetDatabase中调用connect函数时,它可能尚未从异步函数返回(这是日志所建议的,因为错误出现在成功日志之前)。

您可以在dbWrapper.connect()返回之后添加一个回调,以便实际上只能在连接完成后使用dbWrapper。

(使用sqlite时,这可能不会发生,因为它可以在命令行上更快地访问数据库)。

这可能不是您的问题,但看起来像一个候选人。

编辑:这是回调的可能示例,但是请注意,这取决于您需要执行的操作,因此有很多不同的解决方案。 关键是在完成初始化后调用回调函数。

另一个解决方案可能是简单地等待和/或轮询(例如,将变量“初始化”)。

'use strict';

var DBWrapper = require('mongodb').MongoClient;
var dbWrapper = new DBWrapper;

function doConnect(callback) {
  console.log("Initializing DB connection...");
  dbWrapper.connect("mongodb://localhost:27017/test", function(err, db) {
        if (!err) {
                console.log("Database connection successful");
                dbWrapper = db; 
                var collection = dbWrapper.collection('widgets');
                console.log('just created a collection...');
                console.log('calling callback...');
                callback(dbWrapper);
        } else {
          console.log("Error connectingi: " + err);
        }
  }); 
};

doConnect(function(correctDbWrapper) {
    //Now you can use the wrapper
  console.log("Inside callback, now consuming the dbWrapper");
  dbWrapper = correctDbWrapper;
  var collection = dbWrapper.collection('widgets');
});

有趣的是,尽管我通常都使用过类似您的代码,但我从未遇到过这个问题。 我猜是因为通常我在顶部有此数据库初始化,然后必须在节点应用程序上进行大量初始化,这使应用程序有足够的时间从连接调用中返回。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM