我想在Mongo中更新文档,但是当我向服务器发送带有更新参数的Axios POST请求到服务器时,除了服务器端的空白对象外,我什么都没收到-我将Node.js与Express结合使用服务器(MERN堆栈)。
我尝试了qs
库模块和Node的querystring
模块。我尝试包括标头
'Content-Type': 'application/x-www-form-urlencoded'
和'application/json'
。
我的Axios POST请求:
const A = 1;
const B = 2;
const data = { A, B };
console.log(qs.stringify(data)); // A=1&B=2
axios.post(url('upVote'), qs.stringify(data));
服务器路由:
app.post('/upVote', async (req, res) => {
console.log(req.params); // {}
await DB.updateVote(ID, collection, voteCount);
res.end();
});
headers as shown by Chrome's DevTools。
...而且,我所有的axios.get()
请求都可以正常工作,并且可以从Mongo抓取数据并将其正确发送回我的应用程序,并且网址/端点匹配。
答案 0 :(得分:0)
我认为您希望使用.body
而不是.params
。因为您正在使用axios通过邮递方式发送数据。您正在打印参数,但不会为此url / api打印任何内容。
尝试
console.log(req.body) // instead of req.params
如果这不起作用,请向我们显示您的反应代码。
此外
为了做出反应,您必须在axios之后添加.then()
,否则它将说出未兑现的承诺
axios.post(url('upVote/param'), qs.stringify(data));
在服务器
app.post('/upVote/:params', async (req, res) => {
console.log(req.params)
.....
})
答案 1 :(得分:0)
有几种方法可以使用axios将数据发送到服务器。 我在axios中看到了与documentation的混淆,我以前从未见过这种用法,而且在查看请求日志和对象时,它似乎已被打破。
1)axios.post
接收请求的正文作为第二个参数。因此,如果要将参数传递给axios,则应执行以下操作:
const B = 2;
const data = { A: 1, B: 1 };
axios.post(url('upVote'), {}, { params: data });
请注意,axios将自行处理字符串化,并且第三个参数是config object。
在服务器上,这些参数将在request.query
上可用
2)如果您想自己对参数进行字符串化,则应像这样将其附加到您的URL中
axios.post(`url('upVote')?${qs.stringify(data)}`);
与此处相同,服务器上的数据将位于request.query
3)为了方便起见,通常最好使用post请求的主体来传输大型数据有效负载。您还应该考虑什么是缓存策略,并且如果它们依靠请求url而不考虑请求正文,那么这可能是一个问题。
axios.post(url('upVote'), data);
在这种情况下,服务器上的数据将位于request.body
下
UPD:最初忘记提及您将需要一个body-parser
中间件才能访问request.body
。
4)您可以使用没有方法速记的axios,这对某些人可能有用
axios({
method: 'POST',
url: url('upVote'),
params: data
})
这与1中的示例相同。
所有这些都返回一个Promise,您可以.then().catch()
或await
。
答案 2 :(得分:0)
我认为您正在致电res.end()
。我认为应该是res.send(...)
此答案应该会有所帮助:https://stackoverflow.com/a/29555444/1971378