My async function returns Promise.reject
, but caller can't catch it.
I'm using Tedious and Express.
What did I mistake?
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.' });
});
I did wrong SQL statement by Request
.
My expectation was that .catch((e)=>
catch doInsertDansok
function's reject. But didn't.
I'm not entirely sure what you're doing with the request.on('returnValue', ...)
part of your code, but if you just want to return a promise who's resolved value is the rows
data, then you need to actually create a promise and return it and then resolve()
or reject()
it based on the outcome of your asynchronous operation like this:
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);
}
});
});
}