gpt4 book ai didi

javascript - 如何从 Node.js API 正确发送响应代码

转载 作者:行者123 更新时间:2023-11-29 12:36:23 26 4
gpt4 key购买 nike

我有一个简单的基于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com