【问题标题】:how to handle UnhandledPromiseRejection when calling a function in NodeJS在NodeJS中调用函数时如何处理UnhandledPromiseRejection
【发布时间】:2019-02-06 02:53:49
【问题描述】:

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

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 is not defined”所以​​问题是我如何将错误从我的函数传递给调用并捕获它?当我的电话因为我得到的一个或一个或一个原因而失败时 (node:1512) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'leadid' of undefined 在 promise.then (C:\nodeRoot\CRM-NodeJS\routes\leads.js:55:52) 在 process._tickCallback (internal/process/next_tick.js:68:7) (节点:1512) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。 (拒绝 ID:1) 所以我希望这很容易解决

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    (node:1512) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'leadid' of undefined at promise.then (C:\nodeRoot\CRM-NodeJS\routes\leads.js:55:52) at process._tickCallback (internal /process/next_tick.js:68:7) (node:1512)

    之所以发生这种情况,是因为当存储过程中出现错误时您返回 null,要正常运行,您必须从存储过程中抛出一个错误,例如

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

    或者只是你可以从存储过程中删除 try catch 并让路由函数处理错误

    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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 2020-12-12
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2018-05-02
      相关资源
      最近更新 更多