Node Express在发送后无法设置标头

时间:2017-04-01 19:28:12

标签: javascript node.js async.js

我知道已经有多种方式提出这个问题,但我的问题似乎与已发布的问题有所不同。

我尝试将表单中的数据发送到google firebase。我有一个使用express的节点应用程序。

这是我将数据发送到firebase的功能:

function validateForm() {

async.series([
    function (callback) {
        var errors = "<strong>The following errors were entered:\n";
        var name = $('#name').val();
        var story = $('#story').val();

        if (name.length < 1) {
            errors += "\n-Please enter a valid name";
            callback("Please enter a valid name", null);
        }

        if (story.length < 1) {
            errors += "\n-Please enter a valid story";
            callback("Please enter a valid story", null);
        }
        console.log("FInished validating");
        callback(null, "finished validating");
    }, function (callback) {
        firebase.database().ref('stories/' + Date.now()).set({
            name: name,
            story: story
        }, function() {
            console.log("Firebase callback");
            callback(null, "sent data!");
        });
    }, function (callback) {
        console.log("Finished!");
        callback(null, "done")
    }
]) 
}

(为了清楚起见,添加了一些console.logging以确保我的回调正确)

通过单击某个样式看起来像按钮的div来触发提交,因此我知道没有导致问题的表单问题的默认行为。以下是我在Node中遇到的错误。

  

错误:/Users/keegan/WebstormProjects/hack4health/views/error.hbs:   发送后无法设置标头。       在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:356:11)       在ServerResponse.header(/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:719:10)       在ServerResponse.send(/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:164:12)       在res.render.done(/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:956:10)       at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:93:9       完成后(/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20)       at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:88:18       at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:69:11       完成后(/Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/async.js:74:20)       at /Users/keegan/WebstormProjects/hack4health/node_modules/hbs/lib/hbs.js:64:20

2 个答案:

答案 0 :(得分:2)

在这里,您最多呼叫callback三次:

if (name.length < 1) {
    …
    callback("Please enter a valid name", null);
}
if (story.length < 1) {
    …
    callback("Please enter a valid story", null);
}
…
callback(null, "finished validating");

这将导致回调写入多次被调用的响应,在发送第一个主体后尝试再次写入标题时失败。

您需要在致电returncallback,或者您希望最后只使用累计的errors拨打一次。

答案 1 :(得分:0)

原来这是因为从Firebase检索更改数据而不是仅在加载时检索数据。