Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React/Redux:在数据库中创建记录并访问新创建的记录_Reactjs_React Redux - Fatal编程技术网

Reactjs React/Redux:在数据库中创建记录并访问新创建的记录

Reactjs React/Redux:在数据库中创建记录并访问新创建的记录,reactjs,react-redux,Reactjs,React Redux,我在react/redux中,我想在后端数据库(即Mongo)中创建一个新记录,然后获取新创建的记录的唯一id,以便在创建记录后使用。我可以很好地创建记录,并且我希望在调用createrecord操作的同一个函数中使用唯一的id。我不知道如何利用平台的异步特性来实现这一点 记录是一个人(在称为“人”的集合中)。以下是我的代码: 具有调用createPerson操作的函数的组件 调用节点API以创建记录的操作代码 减速器代码。注意,当节点API响应时,它使用新创建的记录进行响应,因此它将新创建的记

我在react/redux中,我想在后端数据库(即Mongo)中创建一个新记录,然后获取新创建的记录的唯一id,以便在创建记录后使用。我可以很好地创建记录,并且我希望在调用createrecord操作的同一个函数中使用唯一的id。我不知道如何利用平台的异步特性来实现这一点

记录是一个人(在称为“人”的集合中)。以下是我的代码:

  • 具有调用createPerson操作的函数的组件
  • 调用节点API以创建记录的操作代码
  • 减速器代码。注意,当节点API响应时,它使用新创建的记录进行响应,因此它将新创建的记录添加到 商店的新状态
  • 以下是调用操作的组件:

    import React from 'react';
    import { connect } from "react-redux"
    import { createPerson } from '../../actions/peopleActions';
    
    @connect(
      (store) => {
        return {
          people: store.people.people,
        };
      },
      (dispatch) => {
        return {
          createPerson: () => {
            dispatch(createPerson());
          }
        }
      }
    )
    export default class PeopleSearch extends React.Component {
    
      createPerson = () => {
        this.props.createPerson();
        /*****************
        This is where I want to be able to execute only once the new person 
        is created and get the ID of the newly created record. But currently, 
        this next line outputs the people array as it exists before the new 
        record is created.
        *****************/
        console.log("After createPerson, with: ", this.props.people);
      };
    
        render = () => {
        return (
          <div>
              <button onClick={this.createPerson}>
                Create Person
              </button>
          </div>);
      }
    }
    
        import axios from "axios";
        import cookie from "react-cookie";
    
        import config from "../config.js";
    
        export function createPerson(fName, mName, lName, sexAtBirth, notes) {
    
        const body = {
            object: {
                fName,
                mName,
                lName,
                sexAtBirth,
                notes
            }
        };
        return (dispatch) => {
            dispatch({type: "CREATE_PERSON"});
            axios.post(config.api_url + "/api/v2/person/create", body, axiosConfig)
                .then((response) => {
                    dispatch({type: "CREATE_PERSON_FULFILLED", payload: response.data})
                })
                .catch((err) => {
                    dispatch({type: "CREATE_PERSON_REJECTED", payload: err})
                })
        }
    }
    
    这是我的减速机:

    export default function reducer(
        state={
            people: [],
            fetching: false,
            error: null,
        },
        action = ""
    ) {
        case "CREATE_PERSON": {
            return {
                ...state,
                fetching: true
            };
        }
        case "CREATE_PERSON_FULFILLED": {
            return {
                ...state,
                fetching: false,
                people: [
                    ...state.people,
                    action.payload
                ]
            };
        }
        case "CREATE_PERSON_REJECTED": {
            return {
                ...state,
                fetching: false,
                error: action.payload
            };
        }
    }
    

    如果你需要我提供更多信息来帮助你,请告诉我。谢谢。

    在一位朋友的帮助下,我想出的解决方案是创建一个新动作,并将附加代码放在创建新人的帖子的.then中。此代码可以从createPerson帖子的响应中获取新创建的ID

    import axios from 'axios';
    import cookie from 'react-cookie';
    
    import config from '../config.js';
    
    const fgtoken = cookie.load('fg-access-token');
    
    var axiosConfig = {
      headers: {'x-access-token': fgtoken}
    };
    
    export function newPerson() {
    
      const body = { object: {} };
      var newChild;
    
      // create a new blank person record for a child
      return (dispatch) => {
        dispatch({type: "CREATE_PERSON"});
        axios.post(config.api_url + '/api/v2/person/create', body, axiosConfig)
          .then((response) => {
            newChild = response.data;
            dispatch({type: "CREATE_PERSON_FULFILLED", payload: response.data})
    
            /******* NEW CODE HERE ***********/
            const birthBody = {
              object: {
                person_id: newChild._id,
                eventType: 'Birth',
              }
            }
    
            // create a blank birth record for the newly created person because we don't trust people without a birthdate.
            dispatch({type: "CREATE_EVENT"});
            axios.post(config.api_url + '/api/v2/event/create', birthBody, axiosConfig)
              .then((response) => {
                dispatch({type: "CREATE_EVENT_FULFILLED", payload: response.data})
              })
              .catch((err) => {
                dispatch({type: "CREATE_EVENT_REJECTED", payload: err})
              });
          })
          .catch((err) => {
          dispatch({type: "CREATE_PERSON_REJECTED", payload: err})
          })
    
      }
    }