Promise/catch 没抓到 promise.reject
Promise/catch didn't catch promise.reject
我的异步函数 returns Promise.reject
,但调用者无法捕获它。
我正在使用 Tedious 和 Express。
我做错了什么?
const connection = require('tedious').Connection;
const Request = require('tedious').Request;
const TYPES = require('tedious').TYPES;
async function doInsertDansok() {
connection.on('connect', (err)=> {
if (err) {
log.error('connection error:', err);
return new Promise.reject(err);
} else {
log.info('connection success');
let request = new Request('SP_TEST_OUTPUT_PARAM 1, @o_retKey OUT, @o_errMsg OUT, @o_retReceiptInfo OUT',
(err, rowCount, rows)=> {
if (err) {
log.error('request error:', err); //<== this log is written.
return new Promise.reject(err);
} else {
log.info(rowCount + " rows(s) returned");
}
});
request.addOutputParameter('o_retKey', TYPES.Int);
request.addOutputParameter('o_errMsg', TYPES.VarChar, {length:100});
request.addOutputParameter('o_retReceiptInfo', TYPES.VarChar, {length:255});
request.on('returnValue', (parameterName, value, metadata) => {
log.info(parameterName + ' = ' + value);
return new Promise.resolve(parameterName, value);
});
connection.callProcedure(request);
}
})
}
exports.insertDansok = function (req, res) {
doInsertDansok()
.then((paramter, value)=> {
log.info('doInsertDansok success');
res.status(200).json({ message: 'insertdansok success.' });
})
.catch((e)=> {
log.error('insertDansok Failed', e); //<== I thought this log be written. But not.
res.status(400).json({ message: 'insertdansok failed.' });
});
我做错了 Request
的 SQL 陈述。
我的期望是 .catch((e)=>
捕获 doInsertDansok
函数的拒绝。但是没有。
我不完全确定你在用代码的 request.on('returnValue', ...)
部分做什么,但如果你只是想 return 一个 promise who's resolved value 是 rows
数据,那么你需要实际创建一个承诺和 return 它,然后 resolve()
或 reject()
它基于你的异步操作的结果,如下所示:
const connection = require('tedious').Connection;
const Request = require('tedious').Request;
const TYPES = require('tedious').TYPES;
function doInsertDansok() {
return new Promise((resolve, reject) => {
connection.on('connect', (err) => {
if (err) {
log.error('connection error:', err);
reject(err);
} else {
log.info('connection success');
let request = new Request('SP_TEST_OUTPUT_PARAM 1, @o_retKey OUT, @o_errMsg OUT, @o_retReceiptInfo OUT',
(err, rowCount, rows) => {
if (err) {
log.error('request error:', err); //<== this log is written.
reject(err);
} else {
log.info(rowCount + " rows(s) returned");
resolve(rows);
}
});
request.addOutputParameter('o_retKey', TYPES.Int);
request.addOutputParameter('o_errMsg', TYPES.VarChar, {length: 100});
request.addOutputParameter('o_retReceiptInfo', TYPES.VarChar, {length: 255});
request.on('returnValue', (parameterName, value, metadata) => {
log.info(parameterName + ' = ' + value);
});
connection.callProcedure(request);
}
});
});
}
我的异步函数 returns Promise.reject
,但调用者无法捕获它。
我正在使用 Tedious 和 Express。
我做错了什么?
const connection = require('tedious').Connection;
const Request = require('tedious').Request;
const TYPES = require('tedious').TYPES;
async function doInsertDansok() {
connection.on('connect', (err)=> {
if (err) {
log.error('connection error:', err);
return new Promise.reject(err);
} else {
log.info('connection success');
let request = new Request('SP_TEST_OUTPUT_PARAM 1, @o_retKey OUT, @o_errMsg OUT, @o_retReceiptInfo OUT',
(err, rowCount, rows)=> {
if (err) {
log.error('request error:', err); //<== this log is written.
return new Promise.reject(err);
} else {
log.info(rowCount + " rows(s) returned");
}
});
request.addOutputParameter('o_retKey', TYPES.Int);
request.addOutputParameter('o_errMsg', TYPES.VarChar, {length:100});
request.addOutputParameter('o_retReceiptInfo', TYPES.VarChar, {length:255});
request.on('returnValue', (parameterName, value, metadata) => {
log.info(parameterName + ' = ' + value);
return new Promise.resolve(parameterName, value);
});
connection.callProcedure(request);
}
})
}
exports.insertDansok = function (req, res) {
doInsertDansok()
.then((paramter, value)=> {
log.info('doInsertDansok success');
res.status(200).json({ message: 'insertdansok success.' });
})
.catch((e)=> {
log.error('insertDansok Failed', e); //<== I thought this log be written. But not.
res.status(400).json({ message: 'insertdansok failed.' });
});
我做错了 Request
的 SQL 陈述。
我的期望是 .catch((e)=>
捕获 doInsertDansok
函数的拒绝。但是没有。
我不完全确定你在用代码的 request.on('returnValue', ...)
部分做什么,但如果你只是想 return 一个 promise who's resolved value 是 rows
数据,那么你需要实际创建一个承诺和 return 它,然后 resolve()
或 reject()
它基于你的异步操作的结果,如下所示:
const connection = require('tedious').Connection;
const Request = require('tedious').Request;
const TYPES = require('tedious').TYPES;
function doInsertDansok() {
return new Promise((resolve, reject) => {
connection.on('connect', (err) => {
if (err) {
log.error('connection error:', err);
reject(err);
} else {
log.info('connection success');
let request = new Request('SP_TEST_OUTPUT_PARAM 1, @o_retKey OUT, @o_errMsg OUT, @o_retReceiptInfo OUT',
(err, rowCount, rows) => {
if (err) {
log.error('request error:', err); //<== this log is written.
reject(err);
} else {
log.info(rowCount + " rows(s) returned");
resolve(rows);
}
});
request.addOutputParameter('o_retKey', TYPES.Int);
request.addOutputParameter('o_errMsg', TYPES.VarChar, {length: 100});
request.addOutputParameter('o_retReceiptInfo', TYPES.VarChar, {length: 255});
request.on('returnValue', (parameterName, value, metadata) => {
log.info(parameterName + ' = ' + value);
});
connection.callProcedure(request);
}
});
});
}