【问题标题】:How do you insert multiple objects into one mongoDB post request如何将多个对象插入到一个 mongoDB 发布请求中
【发布时间】:2022-01-25 17:41:57
【问题描述】:

我已经构建了一个锻炼跟踪器应用程序,它允许您创建一个会话并在该会话中进行多个动作。我将我的应用程序连接到了一个 airtable API,并且刚刚开始学习 mongoDB 并已过渡到该数据库。目前我可以发送一个会话,但它只记录一个动作,而不是所有发送的动作。

下面是我的会话表单的动态代码。

const [formData, setFormData] = useState([
    {
      movement: '',
      weight: '',
      rpe: '',
      reps: '',
      sets: '',
      notes: '',
      session: [
        ""
      ]
    }
  ])

const handleChange = (e, index) => {
    const { name, value } = e.target;
    const form = [...formData];
    form[index][name] = value;
    form[index].session[0] = sessionId;
    setFormData(form);
  };

  const handleAddInput = () => {
    setFormData([...formData,
      {
        movement: '',
        weight: '',
        rpe: '',
        reps: '',
        sets: '',
        notes: '',
        session: [
          ''
        ]
      }
    ]);
  };

映射状态并在我的 API 调用中包含我的身体数据中的运动,我能够将数据获取到我的数据库,但它只发送一个。我明白为什么它只发送一个。我只是想不出任何其他方式将数据包含在 API 调用的正文中。我已经搜刮了谷歌并找不到任何东西。

下面是我的表单的 HandleSubmit,包括 API 调用。

const handleSessionSubmit = async (e) => {
    e.preventDefault()
    formData.forEach(async movement => {
      const sessionData = {
        sessionName,
        date,
        movements: [{ ...movement }]
      }
      const sessionPost = await api.post('/sessions', sessionData )
      console.log(sessionPost);
      
    })
    
    props.setToggle(prevToggle => !prevToggle)
      navigate('/')
    // }
  }

下面是数据库架构

import mongoose from 'mongoose'

const Schema = mongoose.Schema

const Movements = new Schema( 
  {
    movement: { type: String },
    weight: { type: String },
    reps: { type: String },
    rpe: { type: String },
    sets: { type: String },
    notes: { type: String },
  }
)

const Session = new Schema(
  {
    sessionName: { type: String },
    date: { type: String },
    movements: [ Movements ]
  },
  { timestamps: true}
)

export default mongoose.model('sessions', Session)

如果你想看看它是如何工作的,下面是网站 URL 网址:https://pain-workout.netlify.app/

提前致谢!

【问题讨论】:

    标签: node.js reactjs mongodb relational-database


    【解决方案1】:

    您与服务器通信的行为是错误的,您不应该在短时间内针对同一个请求多次访问服务器,而是可以一次发送所有动作的整个有效负载。 如我所见,您将发布请求放在一个 forEach 方法中,该方法肯定会为每个项目发送到 api,而不是这个,您可以将这些 formData 项目映射到一个数组中,然后在循环外的发布请求中发送它们。 这是一个例子:

    前端

    const handleSessionSubmit = async (e) => {
        e.preventDefault()
        const movements = formData.map(movement => movement);
        const sessionData = {sessionName, date, movements};
        const sessionPost = await api.post('/sessions', sessionData )
        props.setToggle(prevToggle => !prevToggle)
          navigate('/')
        // }
      }
    

    后端

    app.post('/sessions', async (req, res, next) => {
      try {
         const sessionData = req.body;
         const session = new Session(sessionData);
         await session.save();
      } catch(err) {
        throw err;
      }
    });
    

    【讨论】:

    • 工作得像个有魅力的人!后端已经像你说的那样设置好了,我所要做的就是将 formdata.map 保存到一个变量中,这样就可以了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2014-08-19
    • 2019-05-02
    • 2018-01-18
    • 2022-08-22
    • 2015-10-16
    • 2020-07-16
    相关资源
    最近更新 更多