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

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

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

файл app.js

//define dependencies
const express = require("express");
const helmet = require("helmet");
const morgan = require("morgan");
const config = require("config");
const instagram = require("passport-instagram");
const passport = require("passport");
const authRouter = require("./router/authRouter");
const userRouter = require("./router/userRouter");
const customerRouter = require("./router/customerRouter");
const cartRouter = require("./router/cartRouter");
const orderRouter = require("./router/orderRouter");
const reviewRouter = require("./router/reviewRouter");
const providerRouter = require("./router/providerRouter");
const itemRouter = require("./router/itemRouter");
const superAdminRouter = require("./router/superAdminRouter");
const baseRouter = require("./router/baseRouter");
const goCreditRouter = require("./router/goCreditRouter");
const Connection = require("./database/connection.js");
const providerAppRouter = require("./router/providerAppRouter.js");
const  paymentRouter =require("./router/paymentRouter.js");
const UserBean =require("./businessobjects/UserBean.js");
const CustomerBean =require("./businessobjects/CustomerBean.js");
const express_logger = require('express-logger-unique-req-id');
const app = express();

        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 ;

1 Ответ

1 голос
/ 05 мая 2019

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

Вы можете просто использовать 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.log('request Id set is: ', httpContext.get('requestId'));
    next();
});
...