Node.js async/await不等待执行sql存储过程的函数返回

Node.js async/await不等待执行sql存储过程的函数返回,node.js,stored-procedures,async-await,synchronous,Node.js,Stored Procedures,Async Await,Synchronous,我有一个执行sql存储过程的函数。函数本身按预期工作。 当我从node.js调用该函数时,route async/await不会等待返回值。 相关代码如下: router.post('/new_item', async (req, res)=> { try { let sp_name = req.body.sp_name; let sp_params = req.body.sp_params; let sql_sp_call_status =

我有一个执行sql存储过程的函数。函数本身按预期工作。 当我从node.js调用该函数时,route async/await不会等待返回值。 相关代码如下:

router.post('/new_item', async (req, res)=> {  
   try {
      let sp_name = req.body.sp_name;
      let sp_params = req.body.sp_params;
      let sql_sp_call_status = 'in-progress'
      sql_sp_call_status = await sql_sp_execute(sp_name, sp_params)
      console.log('2- ' + sql_sp_call_status)
   } catch (err) {
      res.status(500)
      console.log(err)
      res.send(err.message)
   }
  res.json('done')
})
-----------
async function sql_sp_execute(sp_name, sp_params){
  const pool = await poolPromise
  const req = await pool.request();
  await sp_params.forEach(function(param) {
    let ptype1 = sql.TYPES[param.type]
    req.input(param.name, ptype1, param.value);
  });
  await req.execute(sp_name, (err, recordset) => {
  if (err) {
        console.log(err) 
        return 'sql_call_failed'
     }else{
        console.log( '1-success')
        return 'sq_sp_call_success';
     }
   });
}
我希望在控制台中看到:

1-success
2-sq_sp_call_succes
但看起来是这样的:

2- undefined
POST /.../new_item 200 1.300 ms - 6
1- success

您正在回调表达式上使用关键字
await
,因此它的行为与您预期的不一样

wait req.execute(sp_name,(err,recordset)=>{…}//等待回调表达式
您可以使用在节点的
util
模块中导出的函数
promisify

const{promisify}=require('util'))
// ...
const recordset=wait promisify(req.execute.bind(req))(sp_name)//现在节点将等待
//注意:如果出现错误,将抛出err

您在回调表达式上使用了关键字
wait
,因此它的行为与您预期的不一样

wait req.execute(sp_name,(err,recordset)=>{…}//等待回调表达式
您可以使用在节点的
util
模块中导出的函数
promisify

const{promisify}=require('util'))
// ...
const recordset=wait promisify(req.execute.bind(req))(sp_name)//现在节点将等待
//注意:如果出现错误,将抛出err

减少到最小的复制案例。仍然有很多不必要的代码-删除这些代码可能会揭示一些细节。@user2864740很抱歉,我不知道您的意思。例如,删除所有sql参数,以便只有“execute”——是否存在相同的问题?如果是,请查找下一个多余的代码..@user2864740。让我试试。感谢示例,将SQL调用替换为:await setTimeout(()=>console.log(“1-timeout”),100)-是否仍然存在相同的行为?我怀疑是这样的,因为调用接受回调函数来处理结果。检查API,并验证调用的性质。和setTimout一样,这可能不是阻止或返回承诺。减少到最小的复制情况。仍然有很多不必要的代码-删除这些代码可能会揭示一些细节。@user2864740很抱歉,我不知道您的意思。例如,删除所有sql参数,以便只有“execute”——是否存在相同的问题?如果是,请查找下一个多余的代码..@user2864740。让我试试。感谢示例,将SQL调用替换为:await setTimeout(()=>console.log(“1-timeout”),100)-是否仍然存在相同的行为?我怀疑是这样的,因为调用接受回调函数来处理结果。检查API,并验证调用的性质。与setTimout一样,这可能不是阻止或返回承诺。