我在将相同的json对象发送到两个单独的端点时遇到问题。我需要将一个副本发送到数据库,并将另一个副本发送回客户端。我得到can't set headers after they are sent
。我收集到的是一个错误,说res.json()
被调用了一次,并且由于标题已被“放入”而不能被第二次调用。我对开发很新手,任何建议或解释都将非常有帮助。
注意:整个代码成功执行,然后因上述错误消息使服务器崩溃。
paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) {
if (error) {
console.log(error.response);
throw error;
} else {
console.log("Get Payment Response");
console.log(JSON.stringify(payment));
const userData = {paymentID : payment.id};
UserData.addUserData(userData, function(err, userData) {
if (err) {
throw err;
}
res.json(userData);
});
res.json(userData)
}
});
})
答案 0 :(得分:1)
当您写第二遍不能打电话给res.json()
时,您说得对。每个请求只能发送一个响应。 res.json()
发送一个响应,因此您只能调用一次(您可能已经看到过this个问题)。
您不必向数据库发送响应。仅发送请求的客户端应收到响应。调用res.json()
不会将任何内容发送到数据库。为了将userData
对象存储在数据库中,您必须调用执行该操作的函数。就您而言,我假设您正在使用UserData.addUserData()
进行此操作。这是存储的地方,而不是通过发送响应来实现的。
您作为UserData.addUserData()
的参数发送的函数很可能是一个回调,该回调被称为AFTER,它在存储完UserData对象之后完成了。基本上,UserData.addUserData()
将完成应做的所有工作,然后继续执行此后编写的功能。您可以在其中致电res.json()
。您可以删除对res.json()
的最后一次呼叫。不需要,因为您将在数据库中存储完成后在回调函数中调用它。
paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) {
if (error) {
console.log(error.response);
throw error;
} else {
console.log("Get Payment Response");
console.log(JSON.stringify(payment));
const userData = {paymentID : payment.id};
UserData.addUserData(userData, function(err, userData) {
if (err) {
throw err;
}
res.json(userData);
});
}
});
})