使用 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 中发布的主要内容,如果未能解决你的问题,请参考以下文章
Postman测试express中间件(body-parser),req.body为空的问题
即使在 node.js 应用程序中使用 body-parser(使用 CORS 和 HTTPS),req.body 在 POST 中仍然为空