我正在寫一個服務器,並在發佈後將它保存到一個帶有fs的文件中。Nodejs post不斷加載
客戶端頁面繼續加載提交,寫文件是否需要異步,如果是的話,回調看起來像什麼,爲什麼頁面仍然加載。
app.post('/', function(req,res) {
console.log(req.body)
fs.writeFileSync('data.txt', JSON.stringify(req.body))
})
這是因爲我沒有回覆?
我正在寫一個服務器,並在發佈後將它保存到一個帶有fs的文件中。Nodejs post不斷加載
客戶端頁面繼續加載提交,寫文件是否需要異步,如果是的話,回調看起來像什麼,爲什麼頁面仍然加載。
app.post('/', function(req,res) {
console.log(req.body)
fs.writeFileSync('data.txt', JSON.stringify(req.body))
})
這是因爲我沒有回覆?
是的,這是因爲你沒有發送迴應。 Express不會自動發送響應,因此當您發佈到該端點時,您必須返回響應,否則請求將掛起。
文件寫入不必是異步的,但它應該是。現代的方式做,這是使用的承諾,像...
new Promise(function(resolve, reject) {
fs.writeFile('data.txt', JSON.stringify(req.body), (err) =>
{
if (err) reject(err);
else resolve(data);
}
}).then(
(success) => res.send(success)
).catch(
(err) => {
console.log(err);
res.status(500).send();
}
);
如果你不想這樣做異步(你不需要,如果它是一個低性能的網站),只是做:
app.post('/', function(req,res) {
console.log(req.body)
fs.writeFileSync('data.txt', JSON.stringify(req.body))
res.send({"status": 200});
})
你的代碼是罰款,除了忽略發送迴應。如果您沒有通過發送響應或手動呼叫res.end()
來終止連接,則服務器將掛起,發出請求的客戶端將超時。
調用res.send()
將爲您結束連接,並向客戶端發送響應,讓他們知道至少請求的狀態。
只發送一個字符串不應該導致頁面重新加載。
app.post('/', function(req,res) {
console.log(req.body)
fs.writeFileSync('data.txt', JSON.stringify(req.body))
// Set status code to 200, send string response
res.status(200).send('Ok');
})
好吧,發送響應並將其更改爲異步函數將提高我的服務器? – Sprout
是。人們會告訴客戶端服務器正在處理請求,另一個會阻止所述路由成爲整個服務器的巨大瓶頸。 –
因此,當我發送迴應時,它會更改爲另一個頁面,我想發送回覆但保持在同一頁面上。那可能嗎? – Sprout