javascript - 使用 res.json 立即返回响应

标签 javascript node.js express sequelize.js

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

我正在使用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(..)不立即返回客户端?由于 header 已经设置,当最后一行运行时,它会抛出该错误。

最佳答案

您只需有条件地返回错误。该行:

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

总是被执行。原因是您传递给 find 方法的函数仅在数据库响应后在事件循环中稍后调用。这意味着当调用该回调时,您已经在响应中设置了错误。

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

关于javascript - 使用 res.json 立即返回响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28552883/

相关文章:

javascript - 用于团队/教育协作的 Node.js 白板应用程序

javascript - 在ajax中传递多个参数给我错误

node.js - ExpressJS 简单例份验证 - 本地主机重定向您太​​多次

javascript - 如何在命令行中运行 express js(node js) - linux

javascript - React Native Android FlatList onScroll 动画

javascript - 悬停时暂时偏离 CSS 动画,然后恢复

node.js - 使用react-native-image-crop-picker进行React-Native axios图像上传

javascript - 使用 Heroku 部署 Node.js 应用程序时出现公共(public)目录问题

mongodb - 数据没有通过 mongoosastic 从 elasticsearch 索引中删除?

node.js - nodejs multer 将存储的图像检索到客户端