Node.js async / await не ждет возврата функции, выполняющей sql хранимую процедуру - PullRequest
0 голосов
/ 26 мая 2020

У меня есть функция, которая выполняет sql хранимую процедуру. Сама по себе функция работает должным образом. Когда я вызываю эту функцию из маршрута node.js, 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

1 Ответ

2 голосов
/ 27 мая 2020

Вы используете ключевое слово await в выражении обратного вызова, поэтому оно не будет вести себя так, как вы ожидаете.

  await req.execute(sp_name, (err, recordset) => {...}) // awaiting a callback expression

Вы могли бы использовать функцию promisify, экспортированную в Node's util модуль.

const { promisify } = require('util')

// ...
  const recordset = await promisify(req.execute.bind(req))(sp_name) // now node will wait
  // note: err is thrown if it errors
...