我具有以下函数,该函数读取一个数组并将其传递给我的服务器
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) 所以我希望这很容易解决
答案 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)
}