由于误解,您的 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); } }); }); }
这是登录路由文件的更正版本,使用承诺正确:
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中文网其他相关文章!