Node.js无法响应一个以上的猫鼬连接测试请求

时间:2019-05-31 00:42:32

标签: node.js express mongoose

我对猫鼬和节点还很陌生。我正在尝试使用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).jsonres.status(400).json造成了问题,应用程序也将后续请求也视为同一请求。

1 个答案:

答案 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);