首页 > 解决方案 > Express,请求正文在中间件中是 {},但在控制器中有内容

问题描述

这是我的 server.js:

  import express from "express";
import mongoose from "mongoose";
import productRouter from "./routers/productRouter.js";
import dotenv from "dotenv";

dotenv.config();

const app = express();
app.use(express.json());
let prof = process.env.PROF;

mongoose.connect(
 `${prof}`
);

// Add headers before the routes are defined
app.use(function (req, res, next) {
  // Website you wish to allow to connect
  res.setHeader("Access-Control-Allow-Origin", "*");

  // Request methods you wish to allow
  res.setHeader(
    "Access-Control-Allow-Methods",
    "GET, POST, OPTIONS, PUT, PATCH, DELETE"
  );

  res.header("Access-Control-Allow-Headers", "Content-Type");
  // Request headers you wish to allow
  // res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

  // Set to true if you need the website to include cookies in the requests sent
  // to the API (e.g. in case you use sessions)
  res.setHeader("Access-Control-Allow-Credentials", true);

  // Pass to next layer of middleware
  next();
});
/*
app.get("/api/products", (req, res) => {
  res.send(data);
});*/

app.use("/api/products", productRouter);

app.get("/", (req, res) => {
  res.send("Server is ready");
});

const port = process.env.PORT || 5000;
app.listen(port);

进入 productRouter.js ...

  import express from "express";
import mongoose from "mongoose";
import data from "../data.js";
import Product from "../models/productModel.js";
import { payment } from "./paymentController.js";

const productRouter = express.Router();

productRouter.use("/pay", async (req, res, next) => {
  // dont store cart in db, store it in local storage. On checkout get Id of all items in cart. Then find their prices from the db and charge correctly.
  console.log("middleware ran");
  console.log(req.body);
  const productIdsAndAmounts = req.body.basketItems.items.map((item) => {
    return { id: item.id, amount: item.amount };
  });

  // this works faster (apparently)
  /*
  const objIds = productIds.map((id) => mongoose.Types.ObjectId(id));
  const orderedItems = await Product.find({
    _id: { $in: objIds },
  });
*/
  // this sends more query requests to db
  const orderedItems = await Promise.all(
    productIdsAndAmounts.map((productId) => {
      return Product.findById(productId.id);
    })
  );

  let i = -1;
  let productIdsPricesAmounts = [];
  orderedItems.forEach((item) => {
    i = i + 1;
    productIdsPricesAmounts.push({
      id: item.id,
      price: item.price,
      amount: productIdsAndAmounts[i].amount,
    });
  });
  console.log(productIdsPricesAmounts);

  const prices = productIdsPricesAmounts.map((item) => {
    return item.price * item.amount;
  });
  const reducer = (prevValue, currValue) => prevValue + currValue;
  const totalTotalPrice = prices.reduce(reducer);

  console.log(totalTotalPrice);

  req.totalPrice = totalTotalPrice;

  //console.log(orderedItems);
  //console.log(productIdsAndAmounts);

  // console.log(req.body.user); // adres
  next();
});

productRouter.get("/", async (req, res) => {
  const products = await Product.find({});
  res.send(products);
});

productRouter.post("/pay", payment);

export default productRouter;

现在到 paymentController.js:

export const paymentController = async (req, res, next) => { 
console.log(req.body.basketItems)
/* returns contents of the body like expected, i can do whatever i want with it*/ 
}

我可以得到的行为是: 客户端向“api/products/pay”发送请求,我可以访问paymentController中的req.body。

我想要的行为是: 客户端向“api/products/pay”发送请求,请求首先通过一个中间件,在那里我对其进行一些计算,然后我将新变量转发给我的 paymentController。问题是中间件中的 req.body 是 {} productRouter.use(),但在 paymentController 中可用

我究竟做错了什么 ?我是新来表达的,我不知道我在做什么是的。我想访问 productRouter 中的 req.body。我猜我设置了错误的中间件或类似的东西。但我看不出我做错了什么。

标签: javascriptnode.jsexpressrequestmiddleware

解决方案


您可以使用路由器吗?例如:

用户.ts

import express from "express";
let UserRoute = express.Router()
UserRoute.get('/',function (req,res) {
    res.json('Hello World')
})

export { UserRoute }

应用程序.ts

import express from "express";
import cors from "cors";
import {  UserRoute } from "./routes/v1/user"
const http = require('http');
const app = express();
const server = http.createServer(app);
const  PORT : string|number = process.env.PORT || 5000;
app.use(cors());
app.use(express.json());
app.use('/',UserRoute)



//Run Server And Listen To Port
server.listen(PORT,()=>{
    console.log("Server UP")
})

推荐阅读