req.body 在节点和 express 后端应用程序中以相反的顺序向我展示对象

req.body is showing me object in reverse order in node and express backend app

我正在使用 mern stack 和 redux 构建一个待办事项列表网络应用程序。我创建了一个简单的表单来输入数据,但是在将 post 数据发送到后端时我遇到了困难。我的表单文本字段区域名称是 'task'(例如),我传递的值是 'jonas'。前端的一切工作正常,但在后端,当我在 post 方法回调函数中控制 req.body 时,我确实得到 {jonas: ' '} 作为值。为什么会这样?我的意思是它应该是{task: 'jonas'},对吧?

请有人帮我解决这个问题。最近两天我一直在这个问题上。我本可以分享代码截图,但代码库真的很大。

我应该得到 {task: 'jonas'} 的输出(这始终是任何文本字段输入数据的正确格式。)但我得到的只是 {jonas: ''}。

前端(与 Material-UI 反应):

import React, { Fragment, useState } from 'react';
import { useDispatch } from 'react-redux';
import { createTasks } from './../../Actions/TaskActions';
import { Container, FormControl, Button } from '@mui/material';

const Form = props => {
  const [task, setTask] = useState();
  const dispatch = useDispatch();

  const submitHandler = event => {
    event.preventDefault();
    console.log(task);
    dispatch(createTasks(task));
    setTask('');
  };

  return (
    <Fragment>
      <Container maxWidth="sm">
        <form onSubmit={submitHandler} method="post">
          <FormControl fullWidth={true}>
            <input
              name="task"
              type="text"
              value={task}
              onChange={event => setTask(event.target.value)}
            />
            <Button variant="contained" style={{ marginTop: 5 }} type="submit">
              Add tasks
            </Button>
          </FormControl>
        </form>
      </Container>
    </Fragment>
  );
};

export default Form;

React-Redux(调度操作)

import * as api from './../API/API';

export const createTasks = task => async dispatch => {
  try {
    console.log(task);
    const response = await api.addTasks(task);
    console.log(response);

    dispatch({ type: 'CREATE', payload: response });
  } catch (err) {
    console.log(err);
  }
};

API(前后端连接)

import axios from 'axios';

const url = 'http://localhost:5000/tasks';

export const addTasks = newTask => axios.post(url, newTask);

app.js(后端)

const express = require('express');
const morgan = require('morgan');
const cors = require('cors');
const bodyParser = require('body-parser');

const taskRouter = require('./Routes/taskRouter');

const app = express();

app.use(cors());
app.use(bodyParser.json({ limit: '10000kb', extended: true }));
app.use(bodyParser.urlencoded({ limit: '10000kb', extended: true }));
app.use(bodyParser.json());
app.use(morgan('dev'));
app.use(express.json());
// app.use(express.urlencoded({ extended: true }));

// app.get('/', (req, res) => {
//   res.status(200).send('Hello world!');
// });

app.use('/tasks', taskRouter);

module.exports = app;

server.js(后端)

const dotenv = require('dotenv');
const mongoose = require('mongoose');

dotenv.config({ path: `${__dirname}/config.env` });
const app = require('./app');

const DB = process.env.DATABASE.replace(
  '<password>',
  process.env.DATABASE_PASSWORD
);

mongoose
  .connect(DB, {
    useNewUrlParser: true,
  })
  .then(() => console.log('Connected to database...'))
  .catch(err => console.log(err));

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

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

路由器(后端)

const express = require('express');
const taskController = require('./../Controllers/taskController');

const taskRouter = express.Router();

taskRouter
  .route('/')
  .get(taskController.getTasks)
  .post(taskController.createTask);

taskRouter
  .route('/:id')
  .patch(taskController.updateTask)
  .delete(taskController.deleteTask);

module.exports = taskRouter;

控制器(后端)

const taskModel = require('./../Model/taskModel');

exports.createTask = async (req, res) => {
  try {
    // const response = req.body.name;
    // console.log(response);
    console.log(req.body);
    const bodyData = req.body;
    // const response = Object.keys(req.body)[0];
    // console.log(typeof response);

    const answer = new taskModel({
      ...bodyData,
      date: new Date().toISOString(),
    });

    console.log(answer);

    await answer.save();

    res.status(200).json(answer);
  } catch (err) {
    res.status(400).send(err);
  }
};

模型(后端)

const mongoose = require('mongoose');

const taskSchema = mongoose.Schema({
  task: {
    type: String,
    required: [true, 'A to-do list must have a task name'],
  },
  date: {
    type: Date,
    default: new Date(),
  },
});

const taskModel = mongoose.model('taskModel', taskSchema);

module.exports = taskModel;

那么,从表单传递到调度程序再到 axios 请求的“任务”只是一个字符串“jonas”,对吗?在某处你需要把它变成一个对象,

const newTask = {
    task: theTaskVariable     // "jonas" in this case
}

如果你说前端按原样工作,你可以在发出 axios 请求之前在 API 连接中进行更改。我可能已经在表单 submitHandler 中进行了更改,然后相应地对前端进行了更改。