【问题标题】:Nodejs not able to respond to more than one request for mongoose connection testNodejs 无法响应多个猫鼬连接测试请求
【发布时间】: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).jsonres.status(400).json 造成了问题,并且应用程序将后续请求也视为同一请求。

【问题讨论】:

  • return 放在res.status().json 前面对您有帮助吗?
  • @MatinSasan 试过了,没用...可能是因为return 只是从它所在的回调函数中退出,而不是从父函数中退出

标签: node.js express mongoose


【解决方案1】:

通过创建自定义中间件解决了该问题。我没有在控制器函数中通过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);

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 2021-07-15
    • 2015-12-30
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2015-06-19
    • 1970-01-01
    • 2018-09-30
    相关资源
    最近更新 更多