Хороший вопрос! Лично я думаю, что этот подход может немного затормозить вас, сначала я объясню проблему, с которой вы столкнулись, а затем объясню, почему я думаю, что вам следует немного изменить подход.
проблема, которую вы видите, это состояние гонки. В данном конкретном случае next()
не является блокирующим. Он говорит: «Хорошо, я закончил, Express, пожалуйста, продолжайте», и express продолжает свой веселый путь. Если вы добавите несколько журналов консоли в свою программу, вы заметите, что строки после вызова next()
, вероятно, выполняются до того, как ваши более поздние обработчики успеют завершить sh, особенно если они делают asyn c вызовы в базу данных или что-то в этом роде.
Фактически вы выполняете оператор if и cache.set до того, как закончится следующий кусок промежуточного программного обеспечения, что приводит к состоянию гонки.
Я не верьте , хотя я недавно не проверял, что next()
позволит вам пройти и получить обратный вызов, это означает, что вам лучше разбить это промежуточное ПО на две части. Я хотел бы, чтобы восстановление кеша происходило в качестве вашей первой функции, затем вызывало бы другие функции промежуточного программного обеспечения и, наконец, вызывало бы функцию, которая выполняет любые обновления кеша. Думайте о промежуточном программном обеспечении не как о модуле, а скорее как о простой старой функции, и это имеет гораздо больше смысла, чем одна перегруженная функция промежуточного программного обеспечения.
Так что теперь у вас будет
fetchFromCache -> [various middleware, perhaps some hefty controllers] -> updateCache