使用 http 时,req.body 为空 。在 angular 和 node.js 中发布

Posted

技术标签:

【中文标题】使用 http 时,req.body 为空 。在 angular 和 node.js 中发布【英文标题】:req.body is empy when using http. post in angular and node.js使用 http 时,req.body 为空 。在 angular 和 node.js 中发布 【发布时间】:2021-04-27 14:01:39 【问题描述】:

这是我的 service.ts 文件

import  Injectable  from "@angular/core";
import  HttpClient  from "@angular/common/http";
import  Items  from "./inventory.model";
import  Router  from "@angular/router";


import  environment  from "../../../environments/environment";
const BACKEND_URL = environment.APIUrl + "/Items/";

@Injectable(
providedIn: "root",
)
export class InventoryService 
constructor(private http: HttpClient, private router: Router) 

addItem(
itemNo: string,
itemName: string,
maker: string,
unitPrize: string,
sellingPrize: string,
Qty: string
) 



const ItemData = new FormData();
ItemData.append("itemNo", itemNo);
ItemData.append("item_name", itemName);
ItemData.append("maker", maker);
ItemData.append("unitPrize", unitPrize);
ItemData.append("sellingPrize", sellingPrize);
ItemData.append("Qty", Qty);


  this.http
  .post< message: string; items: Items >(
    BACKEND_URL,
    ItemData
  )
  .subscribe((responseData) => 

     console.log(responseData);


  );

  
  

这是我在后端路由中的 item.js

const express = require("express");
const ItemController = require("../controllers/item");
const bodyParser = require('body-parser');
const router = express.Router();

router.post("", ItemController.savepost);

这是我在 Controller 中的 Item.js 文件

    const ItemModel = require('../models/item');

exports.savepost = (req, res, next) => 

  if(Object.keys(req.body).length === 0)
  
    console.log(req.body);
  


  const items = new ItemModel(

    item_no: req.body.itemNo,
    item_name: req.body.itemName,
    maker: req.body.maker,
    unitPrize: req.body.unitPrize,
    sellingPrice: req.body.sellingPrize,
    Qty: req.body.Qty,


  );


  console.log(items.item_no);


  items.save().then(addItem => 
        res.status(201).json(
          message: "Item added Successfully",
          items: 
            ...addItem,
            id: addItem._id
          
        );
  ).catch(error => 

  res.status(500).json(

    message: error
  )

);


这是我的物品模型

const mongoose = require('mongoose');

const itemSchema = new mongoose.Schema(

  item_no:  type: String, required: true ,
  item_name:  type: String, required: true ,
  maker:  type: String, required: true ,
  unitPrize:  type: Number, required: true ,
  sellingPrice:  type: Number, required: true ,
  Qty:  type: Number, required: true ,



);

module.exports = mongoose.model('Items',itemSchema);

响应错误显示这样的消息

项目验证失败”,消息:“项目验证失败:item_no:路径 item_no 是必需的。项目名称:路径 item_name 是必需的。制造商:路径 maker 是必需的。,unitPrize:路径unitPrize 为必填项,salesPrice:路径sellingPrice 为必填项,数量:路径Qty 为必填项。",

【问题讨论】:

【参考方案1】:

/ 放入您的路线

router.post("/", ItemController.savepost);

在 app.js 中使用此代码,因为您不解析 req.body

const bodyParser = require("body-parser");
app.use(bodyParser.urlencoded( extended: false ));
app.use(bodyParser.json());

请尝试以下代码

const ItemData =  
  itemNo,
  item_name,
  maker,
  unitPrize,
  sellingPrize,
  Qty

const headers =  'content-type': 'application/json'  
const body=JSON.stringify(ItemData);
this.http.post< message: string; items: Items >(BACKEND_URL, body,'headers':headers).subscribe((responseData) => 
  console.log(responseData);
);

我测试了后端代码,没错,问题是前端代码中的post请求,你可以查看post请求docomentation

【讨论】:

这已经在我的 app.js 中并且仍然无法正常工作 savepost 中记录req.body 并显示结果 请求正文输出 您是否将项目数据放入请求正文中? service.ts 文件有什么作用? 是的。您可以在 service.tc 中看到将数据添加到“Itemadata”并通过 HTTP POST 传递该 itemData【参考方案2】:

您发送对象数据而不以 JSON 格式解析。所以在发送请求之前首先将其转换为纯 JSON。在 app.js 文件中添加此代码后即可实现此目的。

app.use(bodyParser.json());

【讨论】:

这已经在我的 app.js 中并且仍然无法正常工作

以上是关于使用 http 时,req.body 为空 。在 angular 和 node.js 中发布的主要内容,如果未能解决你的问题,请参考以下文章

req.body 在帖子上为空

在邮递员中使用表单数据使 req.body 为空

Postman测试express中间件(body-parser),req.body为空的问题

Express + Postman,req.body 为空

即使在 node.js 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空

nodejs中req.body为空的问题