我对猫鼬和节点还很陌生。我正在尝试使用Nodejs和Express编写一个简单的API,在其中发送MongoDB URI,如果有效,即用户名/密码组合有效并且已成功建立与该URI的连接,则应返回成功消息。
我最初尝试创建一个单独的函数来尝试连接到给定的URI:
function testURI(uri) {
mongoose.connect(uri, {useNewUrlParser: true} );
mongoose.connection.on("connected", function() { return true } );
}
module.exports.test = function(req, res) {
var uri = req.body.uri;
if(testURI(uri)) res.status(200).json({'success': true});
else res.status(400).json({'success': false});
};
但这失败了,因为猫鼬异步连接,并且“ connected”事件回调无法为主函数返回true
因此,我放弃了使用单独功能的想法,而是尝试在module.exports.test函数中实现该功能:
module.exports.test = function(req, res) {
var uri = req.body.uri;
mongoose.connect(uri, { useNewUrlParser: true, connectTimeoutMS: 2500 });
mongoose.connection.on("connected", function() {
mongoose.connection.close();
res.status(200).json({'success': true});
});
mongoose.connection.on("error", function(err) {
result = {
'error': true,
'errorMsg': 'Error: Could not connect to the given host.'
}
mongoose.connection.close();
res.status(400).json(result);
});
};
这正常工作,除了服务器在响应一个请求后死掉。一旦我尝试使用无效的URI,它就会按预期返回HTTP 400,但是当我发送另一个具有不同URI的请求时,该应用就会崩溃并显示错误
错误:发送标头后无法设置。
然后我必须重新启动应用程序,然后才能发送另一个请求。显然,同一控制器中的两个单独的res.status(200).json
和res.status(400).json
造成了问题,应用程序也将后续请求也视为同一请求。
答案 0 :(得分:0)
通过创建自定义中间件解决了该问题。我没有使用控制器函数中的res.status().json()
返回结果,而是使用了该函数作为中间件,并从下一个函数返回了结果
module.exports.test = function(req, res, next) {
var uri = req.body.uri;
mongoose.connect(uri, { useNewUrlParser: true, connectTimeoutMS: 2500 });
mongoose.connection.on("connected", function() {
mongoose.connection.close();
req.status = 200;
req.result = {'success': true};
next();
});
mongoose.connection.on("error", function(err) {
result = {
'error': true,
'errorMsg': 'Error: Could not connect to the given host.'
}
mongoose.connection.close();
req.status = 400;
req.result = result;
next();
});
};
module.exports.returnDb = function(req, res) {
res.status(req.status).json(req.result);
};
编辑的路线声明:
router.route('/test')
.post(client.test, client.returnDb);