gpt4 book ai didi

javascript - 为什么 req.body 在 Express 中未定义?

转载 作者:行者123 更新时间:2023-12-05 00:34:12 28 4
gpt4 key购买 nike

我正在创建一个 PUT 方法来更新给定的数据集,但是在我的更新函数中, req.body 是未定义的。
Controller .js

async function reviewExists(req, res, next) {
const message = { error: `Review cannot be found.` };
const { reviewId } = req.params;
if (!reviewId) return next(message);
let review = await ReviewsService.getReviewById(reviewId);
if (!review) {
return res.status(404).json(message);
}
res.locals.review = review;
next();
}

async function update(req, res, next) {
console.log(req.body);
const knexInstance = req.app.get('db');
const {
review: { review_id: reviewId, ...review },
} = res.locals;

const updatedReview = { ...review, ...req.body.data };

const newReview = await ReviewsService.updateReview(
reviewId,
updatedReview,
knexInstance
);
res.json({ data: newReview });
}
服务.js
const getReviewById = (reviewId) =>
knex('reviews').select('*').where({ review_id: reviewId }).first();

const updateReview = (reviewId, updatedReview) =>
knex('reviews')
.select('*')
.where({ review_id: reviewId })
.update(updatedReview, '*');
它应该是什么样子:
"data": {
"review_id": 1,
"content": "New content...",
"score": 3,
"created_at": "2021-02-23T20:48:13.315Z",
"updated_at": "2021-02-23T20:48:13.315Z",
"critic_id": 1,
"movie_id": 1,
"critic": {
"critic_id": 1,
"preferred_name": "Chana",
"surname": "Gibson",
"organization_name": "Film Frenzy",
"created_at": "2021-02-23T20:48:13.308Z",
"updated_at": "2021-02-23T20:48:13.308Z"
}
我检查评论是否存在的第一个功能与我的删除方法一起使用。我是否在这些函数之一中遗漏了一些会使 req.body 未定义的东西?

最佳答案

其他答案中没有人真正解释这里的“为什么”。默认 req.bodyundefined或为空,Express 引擎不会读取传入请求的正文。
因此,如果您想知道请求正文中的内容,更进一步,如果您希望读取它然后解析为 req.body所以你可以在那里直接访问它,然后你需要安装适当的中间件来查看它是什么类型的请求,如果那是具有主体(如 POST 或 PUT)的请求类型,然后它会查看传入的内容类型并查看它是否是它知道如何解析的内容类型,然后该中间件将读取请求的主体,对其进行解析并将解析结果放入 req.body所以当你的请求处理程序被调用时它就在那里。如果您没有安装这种类型的中间件,那么 req.body将是 undefined或为空。
Express 为多种内容类型内置了这样的中间件。您可以阅读它们 here在 Express 文档中。有以下内容类型的中间件:

express.json(...)    for "application/json"
express.raw(...) reads the body into a Buffer for you to parse yourself
express.text(...) for "text/plain" - reads the body into a string
express.urlencoded(...) for "application/x-www-form-urlencoded"
因此,您将需要一些中间件来解析您的特定内容,以便您可以在 req.body 中访问它。 .您没有确切地说出您正在使用的数据类型,但从您的数据预期来看,我猜它可能是 JSON。为此,您将放置以下内容:
app.use(express.json());
在您的 PUT 请求处理程序之前的某个地方。如果您的数据格式是其他格式,那么您可以使用其他内置中间件选项之一。
注意,对于其他数据类型,如文件上传等,有完整的模块如 multer用于读取这些数据类型并将其解析为您的请求处理程序可以提供的属性。

关于javascript - 为什么 req.body 在 Express 中未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66555172/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com