Search code examples
node.jses6-promisetedious

Promise/catch didn't catch promise.reject


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.


Solution

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