立即返回res.json响应

Returning a response immediately with res.json

本文关键字:json 响应 res 返回      更新时间:2023-11-29

我有一个快速路由,它接受一些参数,查询数据库,然后返回一些响应。

我正在使用sequelize查询数据库:

router.get('/query', function(req,res) {
    var name = req.params.name;
    var gid = req.params.gid;
    // Query the db
    models.user.find({ where: { name: name }}).then(function(user) {
        models.group.find({ where: { id: gid }}).then(function(group) {
            // if user found, return data to client
            if (user) {
                res.json({"user": user, "group": group});
            }
        });
    }).catch(function(error) {
        // catch any errors from db query
        res.status(500).json({"error":error});
    }); 

    // Return a server error for any other reason
    // This causes ERROR
    res.status(500).json({"error":"Something went wrong. Check your input."});    
});

但我一直在最后一行看到错误:

Can't set headers after they are sent

最后一行似乎总是在运行,即使它找到了一个用户(应该将数据返回给客户端并完成)。

为什么res.json(..)在找到用户后不立即返回客户端?由于已经设置了头,所以当最后一行运行时,它会抛出错误。

您只需要有条件地返回一个错误。线路:

res.status(500).json({"error":"Something went wrong. Check your input."});

总是被处决。原因是传递给find方法的函数只有在db响应之后才会在事件循环中调用。这意味着当调用回调时,您已经在响应上设置了错误。

您应该删除该行,或者决定何时返回错误,但不要每次都返回错误。

请记住javascript是异步的。

一旦您调用此功能

models.user.find({ where: { name: name }})

执行最后一行:

res.status(500).json({"error":"Something went wrong. Check your input."});

你似乎试图满足两种情况:

  1. 来自客户端的错误请求数据,即未给定gid
  2. 内部服务器错误-即数据库错误

我建议您将捕获功能更改为这样的功能:

.catch(function(error) {
    // catch any errors from db query
    if (err === "Unable to connect to database") {
       return res.status(500).json({ error: "There was an internal error"})
    }
    res.status(400).json({"error": "Bad input, please ensure you sent all required data" });
});

阅读标准HTTP状态代码列表:

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

@bhspencer说的是对的。你必须删除最后一行。

这一行可能在数据库中的任何查询之前执行。

您需要在中实现return

models.user.find({ where: { name: name }}).then(function(user) { models.group.find({ where: { id: gid }}).then(function(group) { // if user found, return data to client if (user) { res.json({"user": user, "group": group}); return; } }); }).catch(function(error) { // catch any errors from db query res.status(500).json({"error":error}); return; });

实际上,res.json(并没有在没有return语句的情况下结束node.js代码执行的处理。