2017-05-08 51 views
0

我正在寫一個服務器,並在發佈後將它保存到一個帶有fs的文件中。Nodejs post不斷加載

客戶端頁面繼續加載提交,寫文件是否需要異步,如果是的話,回調看​​起來像什麼,爲什麼頁面仍然加載。

app.post('/', function(req,res) { 
    console.log(req.body) 
    fs.writeFileSync('data.txt', JSON.stringify(req.body)) 
}) 

這是因爲我沒有回覆?

+0

好吧,發送響應並將其更改爲異步函數將提高我的服務器? – Sprout

+0

是。人們會告訴客戶端服務器正在處理請求,另一個會阻止所述路由成爲整個服務器的巨大瓶頸。 –

+0

因此,當我發送迴應時,它會更改爲另一個頁面,我想發送回覆但保持在同一頁面上。那可能嗎? – Sprout

回答

2

是的,這是因爲你沒有發送迴應。 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}); 
}) 
1

你的代碼是罰款,除了忽略發送迴應。如果您沒有通過發送響應或手動呼叫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'); 
})