理解 Node 中的事件驱动代码执行方法


在 App.js 中之前的示例中,我们看到了如何使用 data 和 end 事件从请求中解析数据。

下面的代码片段显示了该 if 块:

if(url === '/username' && req.method === 'POST'){
   const requestBody = [];
   req.on('data', (chunks)=>{
      requestBody.push(chunks);
   });
   req.on('end', ()=>{
      const parsedData = Buffer.concat(requestBody).toString();
      const username = parsedData.split('=')[1];
      fs.writeFileSync('username.txt', username);
   });
   //redirect
   res.statusCode=302;
   res.setHeader('Location','/');
   return res.end();
}

在上面的代码块中,我们注册了两个事件(data 和 end),如果路径匹配 ‘/username’ 且方法为 post。这两个事件的执行顺序由 node.js 内部处理。一旦 node.js 完成事件注册,if 块下面的其他语句将立即执行。

我们在 end 事件之外有 return 语句,如下所示:

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

如果我们添加 return 将 return 语句移动到 end 事件内部,则 if 块下面的其他语句可能会在 end 事件完成之前执行。这是因为 end 事件中的代码执行将在 node.js 内部稍后完成。

如果 return 语句放置不正确,则会出现错误:

错误表明,一旦我们返回了响应,就不应该修改它。if 块下面的其他语句首先执行,然后我们的 end 事件也尝试最后修改响应,这会导致如上所示的错误。

处理上述错误的解决方案:

1. 我们可以将 return 语句添加到 if 块中,而不是事件代码函数

2. if(url === '/username' && req.method === 'POST'){
3.
4.    const requestBody = [];
5.    req.on('data', (chunks)=>{
6.       requestBody.push(chunks);
7.    });
8.
9.    req.on('end', ()=>{
10.      const parsedData = Buffer.concat(requestBody).toString();
11.      const username = parsedData.split('=')[1];
12.      fs.writeFileSync('username.txt', username);
13.
14.   });
15.
16.    //redirect
17.    res.statusCode=302;
18.    res.setHeader('Location','/');
19. return res.end();
20.
21. }

2. 我们可以将 return 语句添加到整个 end 事件函数中:

if(url === '/username' && req.method === 'POST'){
   const requestBody = [];
   req.on('data', (chunks)=>{
      requestBody.push(chunks);
   });
   return req.on('end', ()=>{
      const parsedData = Buffer.concat(requestBody).toString();
      const username = parsedData.split('=')[1];
      fs.writeFileSync('username.txt', username);
      //redirect
      res.statusCode=302;
      res.setHeader('Location','/');
      return res.end();
   });
}

事件代码执行以异步方式工作,开发人员必须仔细编写响应的 return 逻辑。

更新于: 2020年5月13日

123 次查看

启动你的 职业生涯

通过完成课程获得认证

开始
广告