理解 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 邏輯。
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP