我有一个使用yoman完整堆栈生成器生成的node / express js app。我已经将mongo / mongoose换成了cloudant db(这只是对couchdb版本的付费)。我有一个Cloudant node.js库的包装器,它通过包含在promise中的init()
方法处理我的实例的cookie auth。我已经重构了我的应用程序,在根据以下从app.js
myDb.init(config).then(function (db) {
logger.write(1001, '','Connection to Cloudant Established');
// Start server
server.listen(config.port, config.ip, function () {
logger.write(1001, "",'Express server listening on '+config.port+', in '+app.get('env')+' mode');
});
});
在我的快速路线上,我引入了一个新的中间件,它将db对象附加到跨中间件链的请求中,如下所示。这将在设置要使用的两个集合之前获取数据库连接对象。
exports.beforeAll = function (req, res, next) {
req.my = {};
// Adding my-db
req.my.db = {};
req.my.db.connection = myDb.getDbConnection();
req.my.db.orders = req.my.db.connection.use(dbOrders);
req.my.db.dbRefData = req.my.db.connection.use(dbRefData);
next();
};
当我通过POSTman手动驱动我的apis时,这种机制有效,因为快速服务器不会启动,直到数据库连接的承诺得到解决。但是,当运行我的自动化测试时,前几个测试现在总是失败,因为在jasmine开始针对API运行我的测试之前,应用程序还没有完成db的初始化。我可以在我的日志中看到正在进行的请求以及返回myDb.getDbConnection();
的中间件中的undefined
。我正在使用supertest和node-jasmine来运行我的测试。例如
'use strict';
var app = require('../../app');
var request = require('supertest');
describe('GET /api/content', function () {
it('should respond with JSON object', function (done) {
request(app)
.get('/api/content')
.expect(200)
.expect('Content-Type', /json/)
.end(function (err, res) {
if (err) return done(err);
expect(res.body).toEqual(jasmine.any(Object));
done();
});
});
});
所以,我的问题是,在server.listen()
呼叫被解决后myDb.init()
步骤完成之前,如何阻止超级用户发出请求?或者也许之前有某种茉莉花可以用来阻止它运行描述直到承诺得到解决?
答案 0 :(得分:0)
你可以让app
返回一个EventEmitter,当它完成初始化时会发出“就绪”事件。
然后,在before
子句中,您的测试代码可以等到“ready”事件从应用程序到达,然后再继续测试。