Как отправить данные из React на Express - PullRequest
1 голос
/ 01 февраля 2020

Я пытаюсь создать логин / регистрацию для приложения, используя React / Node / Express / Postgres. Я застреваю, получая данные на стороне сервера из моей формы в React.

У меня есть компонент регистра для формы в register.js

import React from 'react';
import useForm from '../form/useForm';

const Register = () => {

    const { values, handleChange, handleSubmit } = useForm({
            name: '',
            email: '',
            password: "",
            password2: ""
        }, register);

    function register() {
        console.log(values);
    }

  return (
            <div className="row mt-5">
              <div className="col-md-6 m-auto">
                <div className="card card-body">
                  <h1 className="text-center mb-3">
                    <i className="fas fa-user-plus"></i> Register
                  </h1>
                  <form 
                    action="/users/register" 
                    method="POST"
                    onSubmit={handleSubmit}>
                    <div className="form-group">
                      <label htmlFor="name">Name</label>
                      <input 
                      className="form-control" 
                      type="name" 
                      name="name" 
                      onChange={handleChange} 
                      placeholder="Enter Name"
                      value={values.name} 
                      required />
                    </div>
                    <div className="form-group">
                      <label htmlFor="email">Email</label>
                      <input 
                      className="form-control" 
                      type="email" 
                      name="email" 
                      onChange={handleChange} 
                      placeholder="Enter Email"
                      value={values.email} 
                      required />
                    </div>
                    <div className="form-group">
                      <label htmlFor="email">Password</label>
                      <input 
                      className="form-control" 
                      type="password" 
                      name="password" 
                      onChange={handleChange} 
                      placeholder="Create Password"
                      value={values.password} 
                      required />
                    </div>
                    <div className="form-group">
                      <label htmlFor="email">Confirm Password</label>
                      <input 
                      className="form-control" 
                      type="password" 
                      name="password2" 
                      onChange={handleChange} 
                      placeholder="Confirm Password"
                      value={values.password2} 
                      required />
                    </div>
                    <button type="submit" className="btn btn-primary btn-block">
                      Register
                    </button>
                  </form>
                  <p className="lead mt-4">Have An Account? <a href="/login">Login</a></p>
                </div>
              </div>
            </div>
  );
};

export default Register;

Хук для обработки действия формы в useForm.js

import {useState, useEffect} from 'react';

const useForm = (initialValues, callback) => {

const [hasError, setErrors] = useState(false);
const [values, setValues] = useState(initialValues);

  const handleSubmit = (event) => {
    if (event) event.preventDefault();
    const options = {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(setValues(values => ({ ...values, [event.target.name]: event.target.value })))
    }
    fetch("/users/register", options)
  }

  const handleChange = (event) => {
    event.persist();
    setValues(values => ({ ...values, [event.target.name]: event.target.value }));
  };

  return {
    handleChange,
    handleSubmit,
    values,
  }
};

export default useForm;

Затем у меня есть файл для управления маршрутами входа / регистрации в users.js

const express = require("express");
const Router = require("express-promise-router");
const db = require("../db");
const router = new Router();

//Login page
router.get('/login', (req, res) => res.send("Login"));

//Register page
router.get('/register', (req, res) => res.send("Register"));

//Register Handle
router.post('/register', (req, res) => {
    console.log(req.body);
    res.send('hecks');
});

module.exports = router;

Я пытался связываться с вещами внутри функции handleSubmit в моем хуке useForm.js, но все приводит к тому, что console.log(req.body) из моего файла users.js возвращается как undefined. Где я иду не так?

Редактировать # 1: Snip от почтальона, отправляющего запрос на почту enter image description here

Редактировать # 2: базовый c структура проекта

.
./client
./client/src
./client/src/components
./client/src/components/register
./client/src/components/register/register.js
./client/src/components/form
./client/src/components/form/useForm.js
./client/src/App.js
./routes
./routes/index.js
./routes/users.js
./server.js

Редактировать # 3: Основной server.js файл

const express = require("express");
const mountRoutes = require("./routes");
const app = express();
mountRoutes(app);
var bodyParser = require("body-parser");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

//catch all other routes
app.get("*", function(req, res) {
    res.send("<h1>Page does not exist, sorry</h1>");
});

const port = process.env.PORT || 5000;

app.listen(port, () => console.log(`Server started on port ${port}`));

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Вы устанавливаете состояние в JSON .stringify, которое возвращает неопределенное. Вы должны передать в нем значения:

  const handleSubmit = (event) => {
    if (event) event.preventDefault();
    const options = {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(values)
    }
    fetch("/users/register", options)
  }
1 голос
/ 02 февраля 2020

Вам необходимо применить bodyParser перед установкой маршрутов. Поэтому измените это следующим образом:

var bodyParser = require("body-parser");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

mountRoutes(app);

Вы не используете затем или ждете в функции handleSubmit, что может вызвать проблему.

Можете ли вы обновить функцию handleSubmit следующим образом и попробовать?

  const handleSubmit = async event => {
    if (event) event.preventDefault();
    const options = {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify(values)
    };

    try {
      const response = await fetch("/users/register", options);

      const responseData = await response.json();

      if (response.ok) {
        console.log("response ok");
        callback();
      } else {
        console.log("response NOT ok");
        throw new Error(responseData.message);
      }
    } catch (err) {
      console.log(err);
      if (err.response) {
        console.log(err.response.data);
      }
    }
  };
0 голосов
/ 02 февраля 2020

?‍? Вы можете попробовать этот код ниже:

userForm. js: Убедитесь, что ваш handleSubmit в вашем userForm.js выглядит следующим образом: 100

const handleSubmit = async(event) => {
    if (event) event.preventDefault();
    const options = {
        method: "POST",
        headers: {
            "Content-Type": "application/json"
        },
        body: JSON.stringify(values)
    }

    try {
        // change with your endpoint
        const endpoint = 'http://localhost:3001/users/register';
        const result = await fetch(endpoint, options);
        // send value to your register function
        callback(result);
    } catch (ex) {
        console.log('Something failed');
        console.log(ex);
    }
}

Вы должны использовать callback(result), чтобы вы могли console.log это значение в функции register.

express сервер: Убедитесь, что на вашем express сервере вы добавили body-parser, он будет выглядеть следующим образом: ?

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

Этот код выше будет Сделай свои req.body работы.

Надеюсь, это поможет тебе ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...