一些背景- 我的NodeJS服务器运行在端口3001上,我的React应用程序运行在端口3000上。我已经在我的React应用程序package.json中设置了一个代理,以代理对端口3001的所有请求-
>>> checkList([2,3,4,9,9,5,1])
True
现在,当我在React应用程序中使用Axios在NodeJS服务器上的“用户/身份验证”路由上发出POST请求时,请求正文在Node服务器上被解析为空白
"proxy": "http://localhost:3001"
但是不幸的是,NodeJS应用程序崩溃,因为它将req.body解析为空白。服务器端的相关代码-
const request = {
method: 'POST',
url: `/users/authenticate`,
headers: {
'Content-Type': 'application/json'
},
body: {
email: email,
password: password
}
};
console.log(request);
axios(request).then((res) => {
//handle success
});
}).catch((err) => //handleError ))
但是,当我在“ authenticate”功能中记录请求时,req.body被解析为空白,这使应用程序崩溃。
现在,当我在React上使用'Request'包执行此操作时,它的工作就完全正常了。下面的代码使用“请求”库-
//in index.js file
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())
app.use('/users', users);
//in users.js file
const express = require('express');
const router = express.Router();
const userController = require('../controllers/users');
router.post('/authenticate', userController.authenticate);
module.exports = router;
//in UserController
const userModel = require('../models/user');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');
module.exports = {
authenticate: function (req, res, next) {
console.log(req);
userModel.findOne({ email: req.body.email }, function (err, userInfo) {
if (err) {
next(err);
} else {
if (bcrypt.compareSync(req.body.password, userInfo.password)) {
const token = jwt.sign({ id: userInfo._id }, req.app.get('secretKey'), { expiresIn: '1h' });
res.json({ status: "success", message: "user found!!!", data: { user: userInfo, token: token } });
} else {
res.json({ status: "error", message: "Invalid email/password!!!", data: null });
}
}
});
},
}
有人知道为什么使用Request而不是在Axios上可以正常工作吗?
“请求”的唯一问题是,我不得不提到完整的URL-“本地主机:3000 ...”,而不仅仅是Axios中的路由。
关于如何更好地实现这一点的任何其他建议也都很好。
答案 0 :(得分:4)
在Axios中将数据添加到请求正文的属性称为data
而不是body
。