向node.js发送数据并从中获取数据?

时间:2019-10-30 12:13:12

标签: javascript reactjs express

在我的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;

将id转换为数字

2 个答案:

答案 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());