В настоящее время я работаю над приложением node.js, и у меня возникает обычная проблема с асинхронным кодом.
Я внедряю сервер службы поверх Node HTTP-модуля.
Этот сервер поддерживает (выражать как) маршруты. Например, у меня есть код, который выглядит так:
server.any("/someRoute",function(req,resp){
resp.end("this text is sent to clients via http")
});
Сервер должен уметь выдерживать сбой, я не хочу разбивать весь сервер, когда есть проблема в переданной функции. Проблема возникает, когда я пишу код, который выглядит следующим образом:
server.any("/someRoute",function(req,resp){
setTimeout(function(){
throw new Error("This won't get caught");
},100);
});
Я не вижу, как я могу поймать ошибку здесь. Я не хочу разбивать сервер на один серверный сбой, вместо этого я хочу обслуживать 500.
Единственные решения, которые я смог придумать, на самом деле не являются выразительными. Я только придумал использовать process.on("uncaughtException",callback)
и аналогичный код, используя Node 0.8 Domains
(который является частичным средством правовой защиты, но домены в настоящее время не работают, и это все еще не очень выразительно, поскольку мне приходится создавать домен для каждая ручка).
То, что я хотел бы выполнить, - это привязка действий throw
от функции к сфере, идеальное решение - это нечто вроде привязки всех брошенных ошибок от функции к определенной функции обработчика.
Возможно ли это? Какова наилучшая практика для обработки ошибок в этом случае?
Я хотел бы подчеркнуть, что он должен иметь возможность продолжать обслуживать запросы после неудачных запросов и перезапускать сервер по каждому запросу или создавать домены для каждого обработчика и ловить свои неперехваченные исключения, кажется мне плохой идеей. Кроме того, я слышал, что promises может мне помочь (что-то о throw
в promises), может ли promises помочь мне в этой ситуации?