在NodeJS中调用函数时如何处理UnhandledPromiseRejection

时间:2018-08-31 05:57:04

标签: node.js express

我具有以下函数,该函数读取一个数组并将其传递给我的服务器

let storedProcedure = async (params, storedProcedureName) => {
const pool = await getOrCreatePool()
let request = await pool.request()
params.forEach((parameter) => {
    parameterDirection = parameter.isOutput ? 'output' : 'input';
    request = request[parameterDirection](parameter.name, parameter.type, parameter.value)
});
try {
    return await request.execute(storedProcedureName)
} catch(err) {
    console.error('StoredProcedure error', err);
    return null;
}
}

我这样称呼它

apiRoutes.put('/update/:leadid', function(req, res) {

var param = validateUpdateLead(req.body, req.params.leadid)   
var promise = sqlUtil.storedProcedure(param,'sp_Leads_UPD')


       promise.then((result) => 
        {
            console.log('LeadID:' + req.params.leadid + ' Updated - ' + result.rowsAffected[0] + ' Rows Effected')
            res.json({ success: true, RowsAffected : result.rowsAffected[0], UpdatedLeadID :req.params.leadid }).status(200)  
        })
        .catch(err)

        {
        res.send('error':err )
        }
 })

当我这样做时,我的系统nodeJs抱怨“ ReferenceError:未定义err”,所以问题是如何将错误从函数传递给调用并捕获它?当我有一个或一个或某个原因导致呼叫失败时 (节点:1512)UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“ leadid”     然后按承诺(C:\ nodeRoot \ CRM-NodeJS \ routes \ leads.js:55:52)     在process._tickCallback(内部/进程/next_tick.js:68:7) (节点:1512)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1) 所以我希望这很容易解决

1 个答案:

答案 0 :(得分:0)

  

(节点:1512)UnhandledPromiseRejectionWarning:TypeError:无法在promise处读取未定义的属性'leadid'。然后在process._tickCallback(内部)(C:\ nodeRoot \ CRM-NodeJS \ routes \ leads.js:55:52) /process/next_tick.js:68:7)(node:1512)

之所以会这样,是因为在存储过程中出现错误时,您将返回null,以使其正常运行,您必须从存储过程中抛出错误,例如

console.error('StoredProcedure error', err);
throw new Error(err);

或者只是您可以从存储过程中删除try catch并让route函数处理类似的错误

let storedProcedure = async (params, storedProcedureName) => {
   const pool = await getOrCreatePool()
   let request = await pool.request()
   params.forEach((parameter) => {
      parameterDirection = parameter.isOutput ? 'output' : 'input';
      request = request[parameterDirection(parameter.name, parameter.type, parameter.value)
   });

  return await request.execute(storedProcedureName)
}