response.end和嵌套回调

时间:2019-04-02 11:34:04

标签: node.js

在这段代码中,我正在nodejs中创建服务器 在这段代码中,我认为它应该先重定向页面,然后再将其写入文件,因为writeFile不保存服务器

const server = http.createServer((req, res)=>{
  const url = req.url;
  const method = req.method;
  if(url === '/')
  {
    res.write('<html>');
    res.write('<head><title>Enter Message</title><head>');
    res.write('<body><form action="/message" method="POST"><input type="text" name="message"><button type="submit">Send</button></form></body>');
    res.write('</html>');
    ***console.log("in if")***
    return res.end();
  }
  if(url === "/message" && method === "POST")
  {
    ***console.log("in if 2")***
    const body = [];
    req.on('data',(chunk)=>{ready to be read
      console.log(chunk);
      body.push(chunk);
    });
    return req.on('end',()=>{
      ***console.log("in end")***
      const parsebody = Buffer.concat(body).toString();
      const message = parsebody.split('=')[1];
      fs.writeFile("message.txt",message,(err)=>{
        ***console.log("writing to file")***
        ***`console.log(parsebody)`***
      });
      res.statusCode = 302;
      res.setHeader('Location','/');
      res.end();
    });
  }

我认为应该是

in if
in if 2
<Buffer 6d 65 73 73 61 67 65 3d 6a 64 73 6e 6a 65 73 6e 65 6a 73>
in end
in if
writing to file
message=jdsnjesnejs

但是输出将变为

in if
in if 2
<Buffer 6d 65 73 73 61 67 65 3d 6a 64 73 6e 6a 65 73 6e 65 6a 73>
in end
writing to file
message=jdsnjesnejs
in if

我认为应该先重定向然后写 和 我还想知道以上哪几行代码触发了重定向

1 个答案:

答案 0 :(得分:0)

此触发重定向的代码应为:

  res.statusCode = 302;
  res.setHeader('Location','/');
  res.end();

从外观上看,这已经是正确的。您确定这不仅是一场比赛,而且在浏览器没有时间进行第二次请求之前,文件的写入很快就完成了吗?

您可以将setTimeout(() => fs.writeFile(...), 2000)放在fs.writeFile周围,看看它是否按照您的期望来排列。

由于console.log的缓冲区很小,我怀疑这只是一场比赛:fs.writeFile“只是”需要写一个文件,而重定向是“对浏览器/套接字的响应” ->“浏览器解释响应”->“浏览器为'/'创建新请求”->“服务器处理新请求”