node.js - 如何将react数据发布到express

标签 node.js reactjs express

我正在尝试创建一个图书应用程序,我在前端使用react,在后端使用 Node js。当我尝试在后端创建时,它说无法 POST/create。我该怎么办,该文件夹分为前端和后端。我正在使用 axios。我是 React js 的新手,请帮忙。我如何将 React 中的表单中的数据传递到 Express 进行保存。

this is the react component create

import React, {Component} from 'react';

class Create extends Component{
    render(){
        return(
            <div>
                <br/>
                <div class="container">
                    <form action="http://127.0.0.1:3000/create" method="post">
                        <div style={{width: '30%'}} class="form-group">
                            <input  type="text" class="form-control" name="BookID" placeholder="Book ID"/>
                        </div>
                        <br/>
                        <div style={{width: '30%'}} class="form-group">
                                <input  type="text" class="form-control" name="Title" placeholder="Book Title"/>
                        </div>
                        <br/>
                        <div style={{width: '30%'}} class="form-group">
                                <input  type="text" class="form-control" name="Author" placeholder="Book Author"/>
                        </div>
                        <br/>
                        <div style={{width: '30%'}}>
                            <button class="btn btn-success" type="submit">Create</button>
                        </div> 
                    </form>
                </div>
            </div>
        )
    }
}

export default Create;

这个index.js在后端

    var express = require('express');
    var app = express();
    var bodyParser = require('body-parser');
    var session = require('express-session');
    var cookieParser = require('cookie-parser');
    var cors = require('cors');
    app.set('view engine', 'ejs');

    //use cors to allow cross origin resource sharing
    app.use(cors({
        origin: 'http://localhost:3000',
        credentials: true
    }));




var books = [{
        "BookID": "1",
        "Title": "Book 1",
        "Author": "Author 1"
    },
    {
        "BookID": "2",
        "Title": "Book 2",
        "Author": "Author 2"
    },
    {
        "BookID": "3",
        "Title": "Book 3",
        "Author": "Author 3"
    }
]




app.get('/home', function (req, res) {
    console.log("Inside Home Login");
    res.writeHead(200, {
        'Content-Type': 'application/json'
    });
    console.log("Books : ", JSON.stringify(books));
    res.end(JSON.stringify(books));

})

app.post('/create', function (req, res) {
    var newBook = {
        "BookID": req.body.BookID,
        "Title": req.body.Title,
        "Author": req.body.Author
    }
    books.push(newBook)
    console.log(books);



})
//start your server on port 3001
app.listen(3001);
console.log("Server Listening on port 3001");

最佳答案

有一些错误。以下是一些更新的代码以及对所发生情况的描述:

React App.js:

import React, { Component } from 'react';
import axios from 'axios';

class Create extends Component {
  constructor(props) {
    super(props);

    this.state = {
      bookID: '',
      bookTitle: '',
      bookAuthor: '',
    };
  }

  handleInputChange = e => {
    this.setState({
      [e.target.name]: e.target.value,
    });
  };

  handleSubmit = e => {
    e.preventDefault();

    const { bookID, bookTitle, bookAuthor } = this.state;

    const book = {
      bookID,
      bookTitle,
      bookAuthor,
    };

    axios
      .post('http://localhost:3001/create', book)
      .then(() => console.log('Book Created'))
      .catch(err => {
        console.error(err);
      });
  };

  render() {
    return (
      <div>
        <br />
        <div className="container">
          <form onSubmit={this.handleSubmit}>
            <div style={{ width: '30%' }} className="form-group">
              <input
                type="text"
                className="form-control"
                name="bookID"
                placeholder="Book ID"
                onChange={this.handleInputChange}
              />
            </div>
            <br />
            <div style={{ width: '30%' }} className="form-group">
              <input
                type="text"
                className="form-control"
                name="bookTitle"
                placeholder="Book Title"
                onChange={this.handleInputChange}
              />
            </div>
            <br />
            <div style={{ width: '30%' }} className="form-group">
              <input
                type="text"
                className="form-control"
                name="bookAuthor"
                placeholder="Book Author"
                onChange={this.handleInputChange}
              />
            </div>
            <br />
            <div style={{ width: '30%' }}>
              <button className="btn btn-success" type="submit">
                Create
              </button>
            </div>
          </form>
        </div>
      </div>
    );
  }
}

export default Create;
  1. 您因使用 class 而不是 className 而收到错误。 class 是react.js 中的保留字,不应使用。
  2. 您使用的是我不推荐的默认发布方法。我将帖子拆分为自己的操作,并使用公共(public)库 axios 进行 CORS 帖子调用。我还创建了一个函数来使用react.js 处理每次按键时的输入更改。
  3. 我向您的组件添加了state。当表单输入将其存储在状态中时,这种情况很常见。我还将变量的名称更改为标题大小写,这是编写代码变量的常用方法。

Node.js 索引.js:

const express = require('express');
const logger = require('morgan');
const cors = require('cors');

const app = express();

//use cors to allow cross origin resource sharing
app.use(
  cors({
    origin: 'http://localhost:3000',
    credentials: true,
  })
);

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

let books = [];

app.get('/home', function(req, res) {
  console.log('Inside Home Login');
  res.writeHead(200, {
    'Content-Type': 'application/json',
  });
  console.log('Books : ', JSON.stringify(books));
  res.end(JSON.stringify(books));
});

app.post('/create', function(req, res) {
  const newBook = {
    BookID: req.body.bookID,
    Title: req.body.bookTitle,
    Author: req.body.bookAuthor,
  };

  books.push(newBook);
  console.log(books);
});

//start your server on port 3001
app.listen(3001, () => {
  console.log('Server Listening on port 3001');
});

  1. 您没有解析请求的正文,因此它返回为 不明确的。我添加了 app.use(express.json());app.use(express.urlencoded({ Extended: false })); 应该 解决大部分问题。
  2. 我更新了 req.body 变量以匹配来自 react 。
  3. 我添加了模块 morgen,您可以在此处看到 app.use(logger('dev')); 这有助于显示您对 dev 的所有请求和状态目的。在本例中,它显示您收到 500(内部服务器错误),因为 Express 无法读取 undefinedbookID(因为正文没有被解析) )。

现在应该可以工作了,如果您有任何问题,请告诉我。

关于node.js - 如何将react数据发布到express,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54952355/

相关文章:

ios - 在 nodejs 上运行的 sprite-kit 游戏

javascript - 如何在express js中声明一个可以从任何 View 调用的函数?

node.js - 如何自动重启 Node 服务器?

reactjs - useMatch 用于在react-router-dom 中测试多种模式

遍历 map 时 JavaScript 堆内存不足?

javascript - 如何为Range添加onKeyDown事件?

reactjs - 如何在单个组件上设置背景图像?

node.js - 将 expressjs 绑定(bind)到特定的 IP 地址

javascript - 有什么方法可以阻止 ExpressJS 为静态资源发送 Set-Cookie header ?

node.js - async.each 表插入麻烦?