由於誤解,您的Node.js 登入API 表現出意外行為Promise如何與非同步操作互動。讓我們解決每個問題:
您的 findUser() 函數未傳回 Promise。相反,它會立即傳回 undefined,因為資料庫查詢是非同步的並且需要時間來執行。要解決此問題,您需要將回呼函數傳遞給query() 方法,該函數將在查詢完成時呼叫:
me.findUser = function(params, res) { var username = params.username; return new Promise(function (resolve, reject) { pool.getConnection(function (err, connection) { if (err) { reject(err); } else { connection.query('select ...', [username], function (err, rows) { connection.release(); if (!err) { resolve(rows); } else { reject(err); } }); } }); }); }
您的錯誤處理程序未觸發,因為承諾的reject() 方法從未被呼叫。在您的程式碼中,當發生錯誤時,您會從資料庫查詢的回呼中傳回 false。相反,您應該拒絕()帶有錯誤的承諾:
me.findUser = function(params, res) { // ... return new Promise(function (resolve, reject) { // ... connection.query('...', [username], function (err, rows) { connection.release(); if (!err) { resolve(rows); } else { reject(err); } }); }); }
這是登入路由文件的更正版本,正確使用Promise:
module.exports = function(app) { app.post('/login/', async function(req, res, next) { try { // Find user in database var rows = await loginM.findUser(req.body, res); // Do something with the data var result = await loginC.doSomething(rows); console.log("Success"); } catch (err) { console.log("Failed: " + err.message); } }); }
透過使用Promise,您可以確保登入 API 中的每個步驟依序執行。 wait 關鍵字可讓程式碼在繼續之前等待 Promise 解析,確保下一步可以存取上一個步驟的資料。此外,使用 try/catch 可讓您處理過程中可能發生的任何錯誤。
以上是為什麼我的 Node.js 登入 API 無法使用 Promise?的詳細內容。更多資訊請關注PHP中文網其他相關文章!