背景信息
我正在尝试我的第一个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 successfulresetDatabase的第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...发布于 2015-07-29 13:14:25
这可能是一个异步问题。
dbSessionjs中的代码
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')。
'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初始化就在顶部,然后必须在节点应用程序上进行大量初始化,这使应用程序有足够的时间从连接调用返回.
https://stackoverflow.com/questions/31687751
复制相似问题