NodeJS异步POST函数查询MSSQL获取密码时Promise未正常工作
解决Node.js异步POST请求中Promise未正确解析的问题
嘿,我瞅了你的代码,问题出在你对async函数返回值的处理上——async函数本身会返回一个Promise对象,你直接把它赋值给password变量时,这个Promise还处于pending状态(因为异步的数据库查询还没完成),所以直接console.log(password)就会输出Promise { pending },而等数据库查询完成后才会打印出正确的密码值。
咱们来改两种方案,都能解决这个问题:
方案一:用.then()处理Promise结果
把自执行async函数返回的Promise用.then()绑定回调,等Promise resolve后再获取密码值:
app.post('/test', function () { let user = 'User'; // 注意你原代码里的querys是笔误,应该改成query let query = 'SELECT [Password] as password FROM [Table] where [User] = ' + SqlString.escape(user); (async function () { try { let pool = await sql.connect(dbConfig); let result = await pool.request().query(query); console.dir(result.recordset[0].password); // 这里能拿到正确值 return result.recordset[0].password; } catch (err) { console.error('数据库查询出错:', err); } })().then(password => { console.log(password); // 这里就能拿到解析后的密码了 }); });
方案二:把路由处理函数改成async函数(更推荐)
直接将POST路由的处理函数声明为async,这样就能在函数内部用await等待异步操作完成,直接获取结果,代码更简洁易读:
// 别忘了加上req和res参数,不然没法给客户端返回响应哦 app.post('/test', async function (req, res) { let user = 'User'; let query = 'SELECT [Password] as password FROM [Table] where [User] = ' + SqlString.escape(user); try { let pool = await sql.connect(dbConfig); let result = await pool.request().query(query); const password = result.recordset[0].password; console.dir(password); console.log(password); // 这里直接拿到正确的密码值 // 记得给客户端返回响应,比如成功提示 res.status(200).send('查询完成'); } catch (err) { console.error('数据库查询失败:', err); // 出错时给客户端返回错误响应 res.status(500).send('服务器内部错误'); } });
另外提两个小细节:
- 你原代码里写的
.query(querys)是笔误,要改成.query(query); - 路由处理函数最好带上
req和res参数,不然没法处理客户端的请求和返回响应,这是Web服务的基本要求哦。
内容的提问来源于stack exchange,提问作者Dodzik
相关产品推荐
相关产品推荐

