【问题标题】: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 为必填项。",

【问题讨论】:

    标签: node.js angular express mongoose angular10


    【解决方案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 中并且仍然无法正常工作
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多