You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:01:25