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