首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >node.js应用程序-如何通过包含连接到mongodb和“共享”连接?

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

Stack Overflow用户
提问于 2015-07-28 21:50:52
回答 1查看 507关注 0票数 1

背景信息

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

下面是我拼凑在一起的代码:

http://pastebin.com/duQQu3fm

问题

正如您从代码中看到的那样,我正在尝试将数据库连接逻辑放入一个dbSession.js文件中并传递出去。

通过执行以下操作,我能够启动http服务器:

代码语言:javascript
复制
dev@devbox:~/nimble_node$ sudo nodejs src/backend/index.js 
Server started and listening on port: 8080
Database connection successful

但是,当我尝试运行我的茉莉测试时,它会失败,并出现以下错误:

代码语言:javascript
复制
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行是:

代码语言:javascript
复制
 var collection = dbSession.collection('widgets');

考虑到在出现错误后,我得到了“数据库连接成功”消息,我认为所发生的情况是,当测试请求dbSession库时,数据库尚未完成要连接的代码。因此,我无法获得集合对象。

我目前正在阅读mongodb在线手册,看看是否能找到一些关于如何做这种事情的提示。如有任何建议或建议,将不胜感激。

编辑1

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

代码语言:javascript
复制
'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)时,请注意以下消息:

代码语言:javascript
复制
dev@devbox:~/nimble_node$ sudo nodejs src/backend/index.js 
Server started and listening on port: 8080
Database connection successful
just created a collection...
EN

回答 1

Stack Overflow用户

发布于 2015-07-29 13:14:25

这可能是一个异步问题。

dbSessionjs中的代码

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

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

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

(使用sqlite,这可能不会发生,因为它在命令行上访问DB的速度更快)。

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

编辑:这里有一个可能的回调示例,但请注意,这取决于您需要做什么,因此有很多不同的解决方案。关键是在完成初始化时调用回调函数。

另一种解决方案可以是简单地等待和/或轮询(例如,chcke一个变量'initialized')。

代码语言:javascript
复制
'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');
});

虽然我从来没有遇到过这个问题,但我通常使用类似于您的代码,这是很有趣的。我猜是因为通常情况下,这个DB初始化就在顶部,然后必须在节点应用程序上进行大量初始化,这使应用程序有足够的时间从连接调用返回.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31687751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档