2014-08-28 81 views
14

3年前我可以在express.js中做多個res.send。
甚至寫一個setTimeout來顯示一個實時輸出。不能在express.js中做多個res.send

response.send('<script class="jsbin" src="http://code.jquery.com/jquery-1.7.1.min.js"></script>'); 
response.send('<html><body><input id="text_box" /><button>submit</button></body></html>'); 
var initJs = function() { 
    $('.button').click(function() { 
    $.post('/input', { input: $('#text_box').val() }, function() { alert('has send');}); 
    }); 
} 
response.send('<script>' + initJs + '</script>'); 

現在,它會拋出:

Error: Can't set headers after they are sent 

我知道和的NodeJS表示已經更新。爲什麼現在不能這樣做?任何其他想法?


找到的解決方案,但 「res.write」 不是API參考http://expressjs.com/4x/api.html ...

:S

回答

29

也許你需要:response.write

response.write("foo"); 
response.write("bar"); 
//... 
response.end() 

res.send隱含地呼叫res.write,然後是res.end。如果您多次致電res.send,它將首次運行。但是,由於第一個呼叫會結束響應,因此您無法向響應添加任何內容。

+0

是的,這聽起來像這可能是他想到的。我完全忘記了Node的'response.write';我的大腦在快遞地:/ – 2014-08-29 04:47:26

+2

很酷,這是我想要的。但是,爲什麼它不是在API參考http://expressjs.com/4x/api.html#res.send ??? – emj365 2014-08-29 08:07:34

+0

也許因爲我們應該使用'res.render'或'res.send',當我是新手時,我使用'res.write'。 @ emj365爲什麼不嘗試'res.render'? – osrpt 2014-08-29 11:41:59

11

response.send發送一個完整的HTTP響應於客戶端,包括報頭和內容,這就是爲什麼你無法多次調用它的原因。事實上,它甚至會結束響應,所以當使用response.send時,不需要明確地呼叫response.end

在我看來,你正在嘗試使用send就像一個緩衝區:寫入它的意圖,以便稍後刷新。然而,這不是該方法的工作原理。您需要在代碼中建立您的回覆,然後撥打一個send電話。

不幸的是,我不能,爲什麼還是作出這一變化時說,但我知道,它一直是這樣至少從快3

相關問題