需要将res.json()发送到两个单独的端点,并引发标头错误(节点/表达)

时间:2019-01-12 06:50:20

标签: node.js json express

我在将相同的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)
        }
    });
})

1 个答案:

答案 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);
            });
        }
    });
})