【问题标题】:Send date from react-date picker to backend将日期从反应日期选择器发送到后端
【发布时间】:2020-12-15 21:56:34
【问题描述】:

我正在尝试学习如何进行预订,但我被困在了第一步。 特别是我创建了一个 Redux 操作,它将选择的日期从前端发送到后端,但它似乎没有到达数据库。 这是我的代码:

型号:

import mongoose from 'mongoose';

var daySchema = new mongoose.Schema({
  date: { type: Date }
});
const Day = mongoose.model('Day', daySchema);
export default Day;

路由器:

import express from 'express';
import expressAsyncHandler from 'express-async-handler';

import Day from '../models/day.js';

const dayRouter = express.Router();


dayRouter.post(
  '/day',
  expressAsyncHandler(async (req, res) => {
    const date = new Day(req.body.date);
    const chosenDay = await date.save();
    if (chosenDay) {
      res.send({
        date: chosenDay
      });
    } else {
      res.status(401).send({ message: 'unable to save to database' });
    }
  })
);


export default dayRouter;

Redux 动作:

import Axios from 'axios';
import { DATE_CREATE_FAIL, DATE_CREATE_REQUEST, DATE_CREATE_SUCCESS } from '../constants/dateConstants';



export const createDate = (date) => async (dispatch) => {
  try {
   
    dispatch({ type: DATE_CREATE_REQUEST });
    const { data } = await Axios.post(
      '/api/day',
      date,
    );
    dispatch({
      type: DATE_CREATE_SUCCESS,
      payload: data,
      success: true,
    });
  } catch (error) {
    dispatch({
      type: DATE_CREATE_FAIL,
      payload:
        error.response && error.response.data.message
          ? error.response.data.message
          : error.message,
    });
  }
};

Redux-reducer:

import { DATE_CREATE_FAIL, DATE_CREATE_REQUEST, DATE_CREATE_SUCCESS } from '../constants/dateConstants';


export const dateCreateReducer = (state = {}, action) => {
    switch (action.type) {
      case DATE_CREATE_REQUEST:
        return { loading: true };
      case DATE_CREATE_SUCCESS:
        return { loading: false, date: action.payload, success: true };
      case DATE_CREATE_FAIL:
        return { loading: false, error: action.payload };
      default:
        return state;
    }
  };

Redux 常量:

export const DATE_CREATE_REQUEST = 'DATE_CREATE_REQUEST';
export const DATE_CREATE_SUCCESS = 'DATE_CREATE_SUCCESS';
export const DATE_CREATE_FAIL = 'DATE_CREATE_FAIL';

服务器:

import http from 'http';
import express from 'express';
import path from 'path';
import mongoose from 'mongoose';
import bodyParser from 'body-parser';
import config from './config.js';
import dayRouter from './routers/dayRouter.js';

const mongodbUrl = config.MONGODB_URL;
mongoose
  .connect(mongodbUrl, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  })
  .then(() => console.log('db connected.'))
  .catch((error) => console.log(error.reason));

const app = express();

app.use(bodyParser.json());

app.use('/api/day', dayRouter);

const __dirname = path.resolve();
app.use(express.static(path.join(__dirname, '/frontend/build')));
app.get('*', (req, res) => {
  res.sendFile(path.join(`${__dirname}/frontend/build/index.html`));
});
app.use((err, req, res, next) => {
  res.status(500).send({ message: err.message });
});

const httpServer = http.Server(app);

httpServer.listen(config.PORT, () => {
  console.log(`Server started at http://localhost:${config.PORT}`);
});

反应组件:

import React, { useState } from 'react';

import Button from '@material-ui/core/Button';
import { makeStyles } from '@material-ui/core/styles';
import DatePicker from 'react-datepicker';
import setHours from "date-fns/setHours";
import setMinutes from "date-fns/setMinutes";

 import { useDispatch } from 'react-redux'; 
 import { createDate } from '../actions/dateAction';


function DayReservationScreen() {


  const [startDate, setStartDate] = useState(
    setHours(setMinutes(new Date(), 30), 16)
  );
 
  const dispatch = useDispatch();
  const submitHandler = (e) => {
    e.preventDefault();
    dispatch(
      createDate({
        date: startDate
      })
    );
    console.log(startDate)
  };

    
  return (
    <div>
      <form onSubmit={submitHandler}>
        <DatePicker
          selected={startDate}
          onChange={date => setStartDate(date)}
          showTimeSelect
        /* showTimeSelectOnly */
          timeIntervals={15}
          excludeTimes={[
        setHours(setMinutes(new Date(), 0), 17),
        setHours(setMinutes(new Date(), 30), 18),
        setHours(setMinutes(new Date(), 30), 19),
        setHours(setMinutes(new Date(), 30), 17)
      ]}
          dateFormat="MMMM d, yyyy h:mm aa"
        />

        <Button
          variant="contained"
          size="small"
          color="primary"
          style={{
                        width: 80,
                        margin: 5
                      }}
          className={classes.button}
          type='submit'
        >
          Submit
        </Button>

      </form>               
    </div>
  );
}
export default DayReservationScreen;

我做错了什么?

【问题讨论】:

  • 您的 express 服务器在哪个端口上运行?
  • 这是端口: PORT: process.env.PORT || 5000

标签: node.js reactjs express redux


【解决方案1】:

前端部分工作正常。但是你有服务器端的问题。

您在/api/day 路由中使用dayRouter,在路由器本身中您使用路径/day

因此,端点的完整路径将是http://localhost:PORT/api/day/day

然后从前端发送请求到http://localhost:PORT/api/day

只需编辑您的路由器:

import express from 'express';
import expressAsyncHandler from 'express-async-handler';

import Day from '../models/day.js';

const dayRouter = express.Router();


dayRouter.post(
  '/',
  expressAsyncHandler(async (req, res) => {
    const date = new Day(req.body.date);
    const chosenDay = await date.save();
    if (chosenDay) {
      res.send({
        date: chosenDay
      });
    } else {
      res.status(401).send({ message: 'unable to save to database' });
    }
  })
);


export default dayRouter;

【讨论】:

  • 谢谢,你是对的,我没有发现。我修复了它,但后来我在 Redux 中遇到了这个错误:payload: 'Parameter "obj" to Document() must be an object, got 2020-12-26T14:45:00.000Z'。对于有兴趣的人,我修复了后者,将 const date = new Day(req.body.date) 修改为 const date = new Day(req.body) 。非常感谢
猜你喜欢
  • 2020-10-12
  • 1970-01-01
  • 2019-09-28
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多