如何在POST请求的Express中间件中正确存储请求体的内容



我在我的React Express项目中有一个中间件,它存储了一个新用户,创建方式如下:

const uuid = require('uuid/v4')
const HttpError = require('../models/http-error')
let DUMMY_USERS = [
{
id: 'u1',
name: 'tanaka',
email: 'test@test.com',
password: 'test'
}
]
const signup = (req, res, next) => {
const { name, email, password } = req.body;
const users = DUMMY_USERS
const hasUser = DUMMY_USERS.find(u => u.email === email);
console.log('hasUser ->',hasUser)
if (hasUser) {
throw new HttpError('Could not create user, email already exists.', 422);
}
const createdUser = {
id: uuid(),
name, 
email,
password
};
users.push(createdUser);
res.status(201).json({user: createdUser});
};

中间件在express Router对象上注册如下:

router.post('/signup', usersControllers.signup)

当我通过邮差保存一个新用户时,使用以下代码体点击端点http://localhost:5000/api/users/signup:

{
"name":"test",
"email":"test@email.com",
"password":"test",
}

保存的正文如下:

{
"user": {
"id": "e8a4fe92-0ff1-452e-ba3f-4145289b26d7"
}
}

和当我记录createdUser对象,我得到未定义的值名称,电子邮件和密码。为什么这些解构值被设置为undefined?

更新显示app.use(express.json())在注册中间件:

之前解析响应体注册中间件被导出到usersRoutes,并在下面的app.js中注册。

const express = require('express')
const HttpError = require('./models/http-error')
const placesRoutes = require('./routes/places-routes')
const usersRoutes = require('./routes/users-routes')
const app = express()
app.use(express.json())
app.use('/api/places', placesRoutes)
app.use('/api/users', usersRoutes)
// middleware to handle unsupported routes
app.use((req, res, next) => {
const error = new HttpError('Could not find this route.', 404)
throw error // could call it as next(error) if this were in asynchronous code eg. communication with the database
})
//error handling middleware
app.use((error, req, res, next) => {
if (res.headersSent) {
return next(error)
}
res.status(error.code || 500)
res.json({message: error.message || 'An unknown error occured!'})
})
app.listen(5000)

这就像上面jfriend00评论的那样:为了处理文件,您可能将content-type设置为multipart/form-data,但是这样做就失去了将正文解析为json的能力。我的处境和你一样,老实说,我找不到任何好的方法来解决这个问题。现在我正试图通过在前端的Blob中"包装"我的正文内容来解决这个问题,然后只向后端发送文件(来自我输入的通常文件,例如图像,视频或其他内容,以及Blob作为文件)。所以现在我正在弄清楚如何在后端捕获这个blob,然后'unwrap'它以便作为我的主体访问其中的内容。如果你找到解决这个问题的更好的办法,请不要犹豫与我联系。由于o/

最新更新