在我的React代码中,我发送了一个“发布”和“获取”请求。我认为我的问题出在服务器端代码中。
常规
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());
const posts = [
{
"postId": 1,
"id": 1,
"title": "To be or not to be",
"body": "Yes, that is the question"
},
{
"postId": 1,
"id": 2,
"title": "So What?",
"body": "What do you want"
}
];
注意:上下文,上面的代码位于问题代码之前
已解决1)发布
用户点击“提交”后,请求将数据发送到服务器
问题:
1)'req.body'为空
fetch("http://localhost:3001/create", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(post)
})
.then(res => this.props.history.push('/posts'))
.catch(err => this.setState({error: true}))
this.setState({
title: "",
body: ""
})
app.post('/create', (req, res, next)=>{
// Request body is empty, why?
console.log(req.body);
})
解决方案:
由于JSON.stringify(post)
,POST请求正在以JSON格式发送数据,我们需要解析此JSON数据,以便可以使用app.use(bodyParser.json());
,并且已经有了。解决了
已解决2)获取
在第一个get请求中,我将对象的“ id”作为URL参数发送,并尝试从服务器接收相应的对象,req正确发送。
问题:在“ findPostById”函数中收到以下错误:
TypeError:无法读取未定义的属性ID
fetch(`http://localhost:3001/posts/${this.props.match.params.id}`)
.then(res=>res.json())
.then(data=>this.setState({loadedPost: data}))
.catch(err=>console.log(err))
app.get('/posts/:id', (req, res, next)=>{
// Correct, receive id
let id = req.params.id;
findPostById(id, (post, err)=>{
if(err){
console.log(err);
}
else{
res.send(post)
}
})
})
let findPostById = (id, cb)=>{
console.log(id, 'Correctly receive the id');
let post = posts.find((post)=>{
return post.id === id;
})
// Receive: 'TypeError: Cannot read property id of undefined'
console.log(post.id);
if(post){
cb(post, null);
}
else{
cb(null, new Error('Could not find post', id));
}
}
解决方案:
post.id
是'number'类型,而id是'string'类型,由于严格相等,返回post.id === id;
的结果为false。因此,我们使用+id
`return post.id === + id;
答案 0 :(得分:1)
检查是否在配置下方缺少服务器端代码。
const bodyParser = require("body-parser");
app.use(bodyParser.json({ limit: "50mb" }));
app.use(bodyParser.urlencoded({ extended: false }));
body解析器使您可以从路线内访问req.body
答案 1 :(得分:1)
对于问题1,
请尝试添加它。
app.use(bodyParser.json());