Node.js async/await 不等待 return 函数执行 sql 存储过程
Node.js async/await does not wait for return of function executing sql stored procedure
我有一个函数可以执行 sql 存储过程。就其本身而言,功能按预期工作。
当我从 node.js 调用该函数时,路由 async/await 不会等待 return 值。
相关代码如下:
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
,因此它不会像您预期的那样运行。
await req.execute(sp_name, (err, recordset) => {...}) // awaiting a callback expression
您可以做的一件事是使用在 Node 的 util
模块中导出的函数 promisify
。
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
我有一个函数可以执行 sql 存储过程。就其本身而言,功能按预期工作。 当我从 node.js 调用该函数时,路由 async/await 不会等待 return 值。 相关代码如下:
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
,因此它不会像您预期的那样运行。
await req.execute(sp_name, (err, recordset) => {...}) // awaiting a callback expression
您可以做的一件事是使用在 Node 的 util
模块中导出的函数 promisify
。
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