NODE JS-EXPRESS: невозможно получить значение из HTTP-контекста для запросов POST и PUT, пока он работает для GET

В среде Node.js и Express я не могу получить значение из HTTP-контекста для запросов POST и PUT, пока он работает для GET. Я использую httpContext для установки уникального идентификатора requestId, чтобы я мог использовать его при регистрации для отслеживания запросов API.

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

файл app.js



        const app = express();
        app.use(httpContext.middleware);
        //Assign unique identifier to each req
        app.use(function (req, res, next) {
          let test = uuidv1();
          httpContext.set("reqId", test);
          next();
        });

        const PORT = process.env.PORT || 3001;
        Connection.setupPool();
        app.use(express.json());
        app.use(helmet());
        if (app.get("env") === "development") {
          app.use(morgan("tiny"));
        }

        //use to access a resource in the root through url
        app.use(express.static("resource"));

        app.use("/users", userRouter);
        //Code For Instagram authentication Using Passport
        logger.info("End-Instagram Authentication Configuration");
        app.listen(PORT, () => {
          logger.info(`app running port ${PORT}`);
        });

Мой код для получения reqId из httpContext

logger.js

   message = httpContext.get("reqId") ? "RequestId: " + 
             httpContext.get("reqId")+" "+ message: ""+ message ;

Кажется, что какой-то код отсутствует вверху. Если это так, пожалуйста, добавьте весь соответствующий код. На всякий случай прочтите как задавать вопросы и как создать минимальный пример

5th 10.04.2019 13:52

Вверху у меня есть только несколько операторов импорта для модулей.

regShank 10.04.2019 14:22

Как кто-то может воссоздать вашу проблему, если вы не поделитесь все своим кодом?

5th 10.04.2019 15:43

Я добавил зависимости, но не думаю, что это поможет кому-то лучше понять мою проблему. Может быть, я ошибаюсь.

regShank 12.04.2019 11:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
4
3 854
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я надеюсь, что это решение решит вашу проблему и сэкономит много часов всем, у кого есть эта проблема.

вы можете просто использовать bindEmitter для решения проблемы

app.use((req, res, next) => {
    httpContext.ns.bindEmitter(req);
    httpContext.ns.bindEmitter(res);
    var requestId = req.headers["x-request-id"] || uuidv4();
    httpContext.set("requestId", requestId);
    console.info('request Id set is: ', httpContext.get('requestId'));
    next();
});

Если я правильно понимаю, промежуточное программное обеспечение, которое ставит запросы в очередь, сбивает с толку httpContext, поскольку оно больше не связывает сообщение с правильным контекстом. Привязка к событиям req/res необходима для обеспечения правильного выбора контекста при фактической обработке запроса.

Duncan 10.05.2019 16:07

Именно это и произошло, как ты и сказал @Duncan

phpniki 13.05.2019 10:05

Большое спасибо за ваш хороший сервис. Мой мозг и сердце благодарны вам.

Julian Lannigan 23.07.2021 01:36

У меня такая же проблема. Попробовал решение bindEmitter выше, и это не сработало.

После нескольких следов и ошибок REF# 1, удалив заголовок 'Content-Type': 'application/json' из моих клиентов, вызов POST позволил установить/сохранить значения в контексте.

Это заставило меня заподозрить, что существует проблема с тем, как взаимодействует промежуточное ПО body-parser(v1.19.0) и express-http-context(v1.2.3).

Когда я изменил порядок промежуточного программного обеспечения таким образом, чтобы body-parser стоял перед express-http-context, httpContext работал, как ожидалось (без необходимости выполнять REF# 1 ), например:

app.use(bodyParser.json()); //must come before
app.use(httpContext.middleware);

В моем случае это сработало после того, как я поставил app.use(httpContext.middleware); после app.use(express.json());

Ron 21.05.2021 03:32

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