我正在写一个服务器,并在帖子上将req.body保存到带有fs的文件中。
客户端页面继续加载提交,writefile是否需要异步,如果是,那么回调应该是什么样子以及为什么页面仍在加载。
app.post('/', function(req,res) {
console.log(req.body)
fs.writeFileSync('data.txt', JSON.stringify(req.body))
})
这是因为我没有发送回复吗?
答案 0 :(得分: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 :(得分: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');
})