作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的基于 Node 的 API,它需要解析一些 JSON,将一些数据保存到 Postgres 中,然后发送适当的响应代码(如 http 201)。我的代码如下所示:
router.route('/customer')
.post(function(req, res) {
Customers = req.body;
var numberOfCustomers = Customers.length;
for(var i = 0; i < Customers.length; i++){
Customer = Customers[i];
console.log(Customer.Name + " " + Customer.Address);
var date = moment(new Date()).unix();
client.query(
'INSERT into customer (name, address, date_modified) VALUES($1, $2, $3) RETURNING id',
[Customer.Name, Customer.Address, date],
function(err, result) {
if (err) {
console.log(err);
status = 1;
} else {
console.log('row inserted with id: ' + result.rows[0].id);
if(numberOfCustomers === i) {
res.status(201).send({ message: "created" });
}
}
});
}
})
我收到这个错误:
_
http_outgoing.js:344
throw new Error('Can\'t set headers after they are sent.');
^
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)
我需要考虑这样一个事实,即我在一个循环中多次执行 Postgres 插入,因此我无法在第一次插入完成后发送我的响应 header 。
在我的“POST”处理程序中什么地方最适合放置我的 res.status(201).send({ message: "created"});
?
最佳答案
除了架构决策(例如,您可能需要一个单独的模块作为 HTTP 适配器来处理发送响应代码的逻辑,而不是在路由 Controller 内部执行),您可以使用 promise 等待所有插入以完成,然后发送一个单个 响应代码。例如,像这样:
var Promise = require('bluebird');
var query = Promise.promisify(client.query);
router.route('/customer')
.post(function(req, res) {
// all your logic, and then
return Promise.all(Customers.map(function() {
return query(sql, [Customer.Name, Customer.Address, date]);
})
.then(function() {
res.status(201).send({ message: 'Created' });
});
});
查看 the bluebird docs对于此示例中使用的 API。
我不熟悉 Postgres 的 API,但概念应该是相似的:您需要等待对您的数据库的所有请求首先得到解决。
关于javascript - 如何从 Node.js API 正确发送响应代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39212388/
我是一名优秀的程序员,十分优秀!