自定义例外。这未定义

时间:2016-03-19 19:06:49

标签: javascript node.js exception

我正在尝试创建自己的异常。 所以我可以根据nodejs服务器运行的环境格式化错误。抛出错误时,这是​​未定义的。

(function () {
  'use strict';
  var states = require('../states');
  var env = states.config.env;
  var _   = require('underscore');

  /**
   * This is a error that is going to be thrown on server errors.
   * The application format the message for the specific environment
   * @param error The error
   */
  var unrecoverableError = function (error) {
    this.name = 'unrecoverableError';
    this.message = _.isEqual(env, 'production') ? 'There was a server error. Please contact server admin' : error.toString();
    this.code = 500;
  };

  unrecoverableError.prototype = Object.create(Error.prototype);
  unrecoverableError.prototype.constructor = unrecoverableError;

  module.exports = unrecoverableError;
}());

我也使用sequelize作为ORM。

organisation.findOne({
        where: {
          name: organisationName
        }
      })
        .then(function (organisation) {
          if (_.isEmpty(organisation)) {
            throw new modelNotFoundException();
          } else {
            resolve(organisation);
          }
        })
        .catch(function (error) {
          if (error instanceof modelNotFoundException) {
            reject(error);
          } else {
            throw new unrecoverableError(error);
          }
        })
        .catch(function (error) {
          reject(error);
        });

然后在我的控制台中我收到错误。

[TypeError:无法设置未定义的属性'name']

我无法弄清楚我做错了什么。它在浏览器中工作。 这是一个工作小提琴的例子。 https://jsfiddle.net/y3gk0hos/

提前致谢

2 个答案:

答案 0 :(得分:1)

错误的发生是因为"use strict";语句的存在阻止了“非法”的错误。访问全球环境。

如果在没有unrecoverableError关键字的情况下调用函数new,则this对象将指向全局环境。虽然在浏览器中允许,但'use strict';语句不允许这样做。

为了确保unrecoverableError方法实例化对象,您需要检查它是否在没有new关键字的情况下执行,并强制正确使用:

var unrecoverableError = function (error) {
  // check if called with 'new'
  if (this instanceof unrecoverableError) {
    this.name = 'unrecoverableError';
    this.message = 'There was a server error. Please contact server admin';
    this.code = 500;
  }
  else {
    // method was not called with 'new'
    return new unrecoverableError(error);
  }
};

答案 1 :(得分:1)

我不明白为什么只在production环境中显示错误消息很重要。

以下是在Node中创建自定义错误的一些代码:https://gist.github.com/justmoon/15511f92e5216fa2624b因此,重构符合该格式。

但这似乎可能比它的价值更多的工作。你可以做这样的事情:throw new Error('Unrecoverable: ' + e.message)