Невозможно позвонить утилизировать на домене в соответствующее время
У меня проблема с domain
модуль. В настоящее время я пытаюсь отловить любые неперехваченные ошибки, возникающие в запросе. Используя express
промежуточное ПО и домены. Все запросы перед вызовом направляются через эту функцию next
и двигаться дальше по правильному маршруту.
app.use (req, res, next) ->
domain = createDomain()
domain.on "error", (err) ->
res.send(500)
domain.dispose()
domain.enter()
next()
Проблема в том, как мне распоряжаться доменом, если ошибка не выдается?
Я мог бы поднять домен и событие за пределами промежуточной одежды, чтобы мне никогда не приходилось распоряжаться, но тогда у меня не будет доступа к аргументам промежуточной одежды, которые мне нужны для отправки 500.
У кого-нибудь есть лучшее решение, как я справляюсь с этим? Я потратил слишком много времени, пытаясь найти способ (и много хакерских способов) справиться с этим. Благодарю.
1 ответ
Вам не нужно звонить domain.dispose()
если ошибок не было. Цель domain.dispose()
состоит в том, чтобы очистить любые ресурсы, которые остались в неопределенном состоянии после выпрыгивания из середины стека, и устранить последующие ошибки, которые могут возникнуть из-за плохого состояния. Обратный зов domain.enter()
это просто domain.exit()
,
Тем не менее, просматривая код для доменов, похоже, что вы не хотите использовать domain.enter
/exit
сюда. Каждый domain.enter / exit соответствует push / pop стека общего массива в коде модуля домена. Так, например, если второй запрос поступает до того, как первый завершен, а затем первый завершается раньше, чем второй, вызов метода exit в обработчике первого домена вызовет домен для второго запроса. Вполне вероятно, что вход и выход не должны быть разделены на асинхронные вещи.
Вы пробовали просто используя domain.run(next)
? Это, кажется, делает трюк для меня. Он в основном входит в домен для вас и затем вызывает обратный вызов, который вы ему даете, а затем сразу же выходит из домена после возвращения обратного вызова. Любые таймеры или источники событий, созданные в то время, когда вы находитесь в домене, также будут ассоциироваться с этим доменом. В этом случае отправители событий также используют аналогичный шаблон ввода-вызова-выхода при вызове обработчиков событий. В коде показано, что не домены отслеживают обработчики событий, а обработчики событий, которые отслеживают домены.
Короче говоря, не пытайтесь соединить ввод с удалением и не пытайтесь использовать вход / выход через асинхронные границы. Используйте run/bind/add/remove.