【发布时间】:2019-10-16 15:29:41
【问题描述】:
我对猫鼬和节点还很陌生。我正在尝试使用 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});
};
但这失败了,因为 mongoose 异步连接,并且“已连接”事件回调无法为主函数返回 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 造成了问题,并且应用程序将后续请求也视为同一请求。
【问题讨论】:
-
将
return放在res.status().json前面对您有帮助吗? -
@MatinSasan 试过了,没用...可能是因为
return只是从它所在的回调函数中退出,而不是从父函数中退出