NodeJS:未处理的承诺拒绝

时间:2017-04-07 21:48:11

标签: javascript node.js oracle promise es6-promise

我有一点问题,在调试完所有应用程序后,我注意到这是导致问题的文件,给我一个UnhandledPromiseRejection

'use strict'

const connection = require('../models/'),
      oracledb   = require('oracledb'),
      conexion   = oracledb.getConnection(connection)
oracledb.outFormat = oracledb.OBJECT;

module.exports  = {
  index(req, res) {
  conexion.then(con => {
    return con.execute(
      `SELECT id_application, name, description, creation_date ` +
      `FROM application `
    ).then(bucket => {
      return con.execute(
        `SELECT id_definition, id_application, field_name_original, field_name_new,
        column_name, position, id_type_data, field_size, creation_date,
        description, filter, visible ` +
        `FROM definition `
      ).then(definitions => {
        res.status(200).json(creaJSON(bucket, definitions))
      }).catch(error  => { return res.status(500).json({'message': error}) })
    }).catch(err  =>  { return res.status(500).json({'message': err}) })
  }).catch(err  =>  { return res.status(500).json({'message': err}) })
  },
  create(req, res)  {
  },
  update(req, res)  {
  }
}

const doRelease = (connection) => {
  connection.close((err)  =>  {
    if(err) console.error(err.message);
  })
}

const creaJSON = (buckets, definitions)  => {
  var df = new Array()
  buckets['rows'].map(obj =>  {
    definitions['rows'].map(def =>  {
      if(obj['ID_APPLICATION'] == def['ID_APPLICATION']) df.push(def)
    })
    obj['Definitions'] = df
    df = []
  })
  return buckets.rows
}
UnhandledPromiseRejection后面跟着Error: ORA-12170: TNS:Connect timeout occurred

之后

(node:1270) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.JS process with a non-zero exit code.

我已经找到了解决方案,有人说承诺没有正确捕捉,但我没有看到任何问题。还有其他建议吗?

欢迎任何帮助。

由于

1 个答案:

答案 0 :(得分:1)

const connection = require('../models/'),
  oracledb   = require('oracledb'),
  conexion   = oracledb.getConnection(connection)

conexion设置为执行整个源文件时调用.getConnection所返回的承诺(响应需要)。

conexion目前没有处理程序。只有在调用导出的index对象的{index, create, update}方法时才会添加处理程序。

因此,在需要的源文件和被调用的index之间的连接超时将产生未处理的拒绝错误。

显然添加了一个catch子句,例如

 conexion   = oracledb.getConnection(connection).catch( onRejected)

应修复此错误,但您希望将多少恢复放入编码onRejected中取决于您。

<小时/> 编辑:

一种不太明显的方法来满足V8的如何处理未被捕获的承诺拒绝的版本是提供一个虚拟处理程序来阻止它:

conexion   = oracledb.getConnection(connection);
conexion.catch(()=>undefined); // a do nothing catch handler.

这里第二行为conexion承诺添加了一个处理程序,使其处理&#34;这可以防止它成为未被捕获的承诺拒绝。 catch返回的承诺是多余的,没有记录,但如果永远调用了无操作捕获处理程序,将完成

现在,在调用index之前,可以拒绝在 conexion 中保留的承诺,而不会生成异常。这是否是为特定应用程序编写承诺拓扑的最佳方法是一个不同的问题 - 您可能希望更早地解决连接超时问题。