Nodejs不断加载

时间:2017-05-08 18:14:51

标签: javascript node.js

我正在写一个服务器,并在帖子上将req.body保存到带有fs的文件中。

客户端页面继续加载提交,writefile是否需要异步,如果是,那么回调应该是什么样子以及为什么页面仍在加载。

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

这是因为我没有发送回复吗?

2 个答案:

答案 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');
})