Node Express发送后无法设置标题

问题描述:

我知道这已被多种方式询问过,但我的问题似乎与已发布的问题有所不同。Node 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中遇到的错误。

Error: /Users/keegan/WebstormProjects/hack4health/views/error.hbs: Can't set headers after they are sent. at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:356:11) at ServerResponse.header (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:719:10) at ServerResponse.send (/Users/keegan/WebstormProjects/hack4health/node_modules/express/lib/response.js:164:12) at 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 at done (/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 at done (/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

+0

我提供的JS是客户端 – thekeegs

+0

并有100%defo没有任何代码在您的应用程序的其他地方被触发?我曾经有过类似的情况,但之后它总是在其他地方变得很小。 – John

原来,这是由于从Firebase检索更改后的数据而导致的,而不是仅在加载时检索数据。

在这里,您所呼叫的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"); 

这将导致写入响应中多次调用,当它试图再次写入头失败的回调发送第一个主体后。

在致电callback之后,您要么拨打return,要么最后拨打电话errors