理解 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 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.