立即返回res.json响应
Returning a response immediately with res.json
我有一个快速路由,它接受一些参数,查询数据库,然后返回一些响应。
我正在使用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响应之后才会在事件循环中调用。这意味着当调用回调时,您已经在响应上设置了错误。
您应该删除该行,或者决定何时返回错误,但不要每次都返回错误。
一旦您调用此功能
models.user.find({ where: { name: name }})
执行最后一行:
res.status(500).json({"error":"Something went wrong. Check your input."});
你似乎试图满足两种情况:
- 来自客户端的错误请求数据,即未给定gid
- 内部服务器错误-即数据库错误
我建议您将捕获功能更改为这样的功能:
.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代码执行的处理。
- 在不同的javascript数组中对json响应进行排序
- Laravel数据表无效的JSON响应
- 使用Backbone.js访问JSON响应的部分
- 不需要的JSON响应
- 跨多个域的json响应
- 将对Ajax PUT的json响应重定向到要由EL解析的JSP中
- handler没有为JSON响应正确填充模板
- 如何在phonegap应用程序中处理Ajax json响应
- 将JSON响应放入var中并输出
- 如何使用AngularJS将if语句conditon与json响应一起使用
- JS-通用解析JSON响应
- 将json响应格式化为父级和子级
- 从 JSON 响应解析数据
- 单个和多个 JSON 响应
- 将日期作为从 Web API 到 angularJS 的 json 响应
- 在 JSX Render for React.js 中遍历 JSON 响应
- 使用 JavaScript 从 URL 获取 JSON 响应
- 使用来自AngularJS的Web API JSON响应-错误:应为和数组,但得到了一个对象
- 生成动态json响应的Javascript
- 如何将json响应的一部分转换为map