[英]node.js application - how to connect to mongodb and “share” connection via an include?
背景资料
我正在尝试我的第一个node.js API /应用程序。 作为一项学习练习,我试图创建一些测试用例,首先删除表中的所有记录,插入3条特定记录,然后查询这3条记录。
码
这是我拼凑的代码:
问题
从代码中可以看到,我正在尝试将数据库连接逻辑放在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.