2016-03-19 2 views
1

Я пытаюсь создать свое собственное исключение. Так что я могу отформатировать ошибку на основе среды, на которой запущен сервер 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: Невозможно установить «имя» свойства неопределенных]

Я не могу понять, что я сделал неправильно. Он работает в браузере. Вот пример рабочего скрипта. https://jsfiddle.net/y3gk0hos/

Заранее спасибо

ответ

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

Я называю это новым правом? Или я понимаю, что вы ошибаетесь. "throw new unrecoverableError (ошибка);" –

+0

Решение работает, но я не знаю, является ли это правильным решением. –

1

Я не понимаю, почему его важно только показать сообщение об ошибке в среде production.

Ниже приведен код для создания пользовательской ошибки в узле: https://gist.github.com/justmoon/15511f92e5216fa2624b Так что рефакторинг соответствует этому формату.

Но похоже, что это может быть больше работы, чем его ценность. Возможно, вы можете просто сделать что-то вроде этого: throw new Error('Unrecoverable: ' + e.message).

+0

Потому что я использую пользовательские ошибки для отображения ответа. Таким образом, modelNotFoundException даст 404. И у меня есть invalidParamsException, которое дает 400. И все ошибки будут неустранимымиError. Сообщение отвечает пользователю. Поэтому я не хочу, чтобы системная ошибка отображалась пользователю. Поскольку его системная ошибка настолько бесполезна для пользователя –

+0

ОК, если вы хотите использовать пользовательские ошибки, но я говорил о проверке prod/vs dev, в этом примере кажется, что он может просто отображать сообщение в консоли для dev/test, а также prod. Но это побочный вопрос. –

+0

Можете ли вы попробовать изменить свой код, чтобы больше походить на этот связанный смысл? –

Смежные вопросы