Arhn - архитектура программирования

как остановить сервер node js от сбоя

Я новичок в узле js. Я пытался создать простой HTTP-сервер. Я последовал известному примеру и создал «Hello World!». сервер следующим образом.

var handleRequest = function(req, res) {
  res.writeHead(200);
  res1.end('Hello, World!\n');
};

require('http').createServer(handleRequest).listen(8080);

console.log('Server started on port 8080');

Запуск этого кода запустит сервер должным образом, как и ожидалось. Но попытка доступа к http://127.0.0.1:8080 приведет к его краху, выдав ошибку, что res1 не определено. Я хотел бы, чтобы сервер продолжал работать и изящно сообщал об ошибках всякий раз, когда он сталкивался с ними.

Как мне этого добиться? Я попробовал try-catch, но это мне не помогает :(


  • См. stackoverflow.com/a/8114990/435413 (javascript для автоматической перезагрузки) или stackoverflow.com /questions/5999373/ (предотвратить сбой) 13.01.2013
  • Привет, Бенджамин, я специально набрал его как res1, чтобы вызвать ошибку. Мой вопрос о том, как обрабатывать такие ошибки без сбоя сервера. 13.01.2013

Ответы:


1

Тут куча комментариев. Прежде всего, чтобы ваш пример сервера работал, handleRequest должен быть определен ДО его использования.

1- То, что вы на самом деле хотите, что предотвращает выход процесса, может быть обработано обработкой uncaughtException (документация) событие:

var handleRequest = function(req, res) {
    res.writeHead(200);
    res1.end('Hello, World!\n');
};
var server = require('http').createServer(handleRequest);
process.on('uncaughtException', function(ex) {
    // do something with exception
});
server.listen(8080);
console.log('Server started on port 8080');

2- Я бы рекомендовал использовать try{} catch(e) {} в вашем коде, например:

var handleRequest = function(req, res) {
    try {
      res.writeHead(200);
      res1.end('Hello, World!\n');
    } catch(e) {
      res.writeHead(200);
      res.end('Boo');
    }
};

3- Я думаю, что пример был просто примером, а не фактическим кодом, это ошибка синтаксического анализа, которую можно предотвратить. Я упоминаю об этом, поскольку вам НЕ НУЖНО иметь ошибки синтаксического анализа в обработчиках исключения.

4. Обратите внимание, что в будущем узел process будет заменен на домен.

5- Я предпочел бы использовать фреймворк типа express, чем заниматься этим.

6- Рекомендуемая лекция: StackOverflow - лучшая практика NodeJS для обработки исключений

13.01.2013
  • 1 неверно, 2 неверно для асинхронного кода, 4 неверно, так как процесс будет дополнен доменом, а домен теперь тоже работает 13.01.2013
  • @BenjaminGruenbaum 1 почему? Объясните дальше + это действительно работает и предотвращает сбой приложения. 2 автор никогда не говорит, что ему нужно обрабатывать исключения синтаксического анализа в асинхронном коде. 4 домен находится в нестабильной версии, а в документах узла указано явно использовать домен ВМЕСТО процесса 13.01.2013
  • Спасибо, Том... пункт 1 у меня сработал... И я буду следовать вашим предложениям. Я рассмотрю возможность использования экспресса. 13.01.2013

  • 2

    Я ориентируюсь не на детали вашего вопроса, а на заголовок вашего вопроса о предотвращении сбоя сервера Node. Вы, вероятно, можете использовать DOMAIN, это, вероятно, предотвратит сбой вашего сервера, когда выдается исключение uncaughtException.

    domain = require('domain'),
    d = domain.create();
    
    d.on('error', function(err) {
      console.error(err);
    });
    

    для получения более подробной информации перейдите на http://shapeshed.com/uncaught-exceptions-in-node/

    кроме того, используя этот метод, вы должны попытаться поймать свой блок.

    15.03.2014

    3

    Возможно, вам следует определить handleRequest перед его использованием:

    require('http').createServer(handleRequest).listen(8080);
    
    function handleRequest(req, res) {
      res.writeHead(200);
      res1.end('Hello, World!\n');
    };
    

    Or

    var handleRequest = function(req, res) {
      res.writeHead(200);
      res1.end('Hello, World!\n');
    };
    
    require('http').createServer(handleRequest).listen(8080);
    

    И вы должны быть уверены, что res1 тоже существует.

    13.01.2013
  • Нет, javascript автоматически перемещает операторы var в верхнюю часть области видимости. 13.01.2013
  • Привет @NULL, да ... handleRequest должен быть выше строки createServer. Виноват. Я неправильно скопировал это (сейчас обновляю вопрос). Теперь, перейдя к ошибке res1, я знаю причину ошибки. Я пытался спросить о изящном обращении с ним. 13.01.2013
  • @BenjaminGruenbaum Да, handleRequest определено, но undefined . Это как написать: var a; b(a) a = function(){...} 14.01.2013
  • нет, @BenjaminGruenbaum прав. объявления функций поднимаются (что отличается от анонимного назначения функции переменной) 14.01.2013
  • да, таким образом undefined передается функции. 14.01.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..