Невозможно позвонить утилизировать на домене в соответствующее время

У меня проблема с 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.

Другие вопросы по тегам