Возвращает клиентам ответ с предоставленными ими данными. Как автоответчик, поступающий из проекта MERN базы данных

#javascript #reactjs #response #mern #destructuring

#javascript #reactjs #ответ #mern #деструктурирование

Вопрос:

Я пытаюсь представить ответ своим клиентам при отправке формы. Отправка успешно сохранена в моей базе данных, и ниже я пытаюсь получить ответ в свойстве массива posts. Затем деструктурируйте его как массив объектов и предоставьте ответ моим клиентам «.

Проблема в том, что я продолжаю получать данные первого клиента, который отправил форму. » Я хочу, чтобы каждому клиенту было представлено сообщение о приеме с предоставленной им информацией.

 //The state of the component
this.state = {
             companyName: "",
             email: "",
             phone: "",
             selectName: "",
             message: "",
             count: 1,
             date: "",
             posts: [],
};
  

После успешной отправки данных в мою базу данных я хочу представить один результат моему текущему клиенту. Получено в моем массиве сообщений.

 //   Here am getting a response from my database
getNewCustomer = () => {   
   axios
     .get("/api")
      .then((response) => {
        let data = response.data;
         this.setState({ posts: data });
         console.log(`Data has been received!!`);
      })
      .catch(() => {
         alert(`Error retrieving data receive!!`);
      });
};
  

Здесь я пытаюсь уничтожить данные и вернуть ответ под моей формой текущему клиенту.

 //Handle submit
 const payload = {
     companyName: this.state.companyName,
     email: this.state.email,
     phone: this.state.phone,
     selectName: this.state.selectName,
     message: this.state.message,
     count: this.state.count,
     date: this.state.date,
  };

  axios({
     url: "/api/save",
     method: "POST",
     data: payload,
  })
     .then(() => {
        console.log(`Data has been sent to the sever `);
        this.resetUserInputs();
        this.getNewCustomer();
     })
     .catch((error) => {
        console.log(`Error occured ${error.message}`);
     });    }



     displayContactMessage = (posts) => {  //Code to present to client a response
           if (!posts.length) {
              return null;
           }
     
           for (const {
              companyName: cName,
              email: eMail,
              phone: pHone,
              selectName: sName,
              count: countNow,
              date: dateNow,
           } of posts) {
              return (
                 <section className="background-tertiary">
                    <div style={{ padding: "1rem" }}>       
                       <strong>
                          <em>
                             Automatic Response From our Office {countNow} date:
                             {dateNow}
                          </em>
                       </strong>
                       <p>
                          Thanks for contacting dear <mark>{cName}</mark>. We have
                          received your email: <mark>{eMail}</mark> and phone
                          number : <mark>{pHone}</mark>. Based on your contact
                          marked as a <mark>{sName}</mark> message you are ranked as
                          a prioritized client on our contact list.
                       </p>
                       <dl>
                          <dt>Administrator</dt>
                          <dd>####LLKJLA###</dd>
                          <dd>{this.state.date}</dd>
                       </dl>
                    </div>
                 </section>
              );
           }
  

Моя проблема в том, что я продолжаю получать первые отправленные данные в своей базе данных. Как мне получить отправленные данные текущего пользователя и представить ему или ей при отправке формы?

Комментарии:

1. код, который вы публикуете здесь, является неполным. Я ожидал увидеть форму и то, как вы публикуете данные. даже действие post службы api.

2. Когда клиенты отправляют форму, я отправляю им благодарственное сообщение с предоставленной информацией. Но я всегда получаю первые отправленные данные в своей базе данных.

3. Это проект стека MERN, я впервые задаю вопрос. Не просматривал заголовок перед публикацией. <form onSubmit={this.handleSubmit} >

Ответ №1:

Как сказал Нсикан, просмотр фактической формы поможет нам помочь вам! Но в вашем коде есть подсказки. Я вижу две проблемы.

Во-первых, ваш client.displayContactMessage метод не может работать как есть. Цикл for(... of posts) of вернется на самой первой итерации. Если вы хотите отобразить несколько ответов, вам придется использовать map, как описано в разделе React doc «Списки и ключи».

Но поскольку вы сказали, что вам нужно отобразить только один ответ, это приводит нас ко 2-й проблеме: ваш axios.get("/api") , по-видимому, получает весь список отправленных форм! Здесь не только существует огромный риск раскрытия конфиденциальной информации, но вам не нужны все эти данные. Вам нужно только это из только что отправленной формы.

И у вас уже есть эти данные в состоянии вашего компонента.

Вы могли бы заменить:

 for (const {
    companyName: cName,
    email: eMail,
    phone: pHone,
    selectName: sName,
    count: countNow,
    date: dateNow,
 } of posts) {
  return (
    // your JSX
  );
}
  

С помощью этого:

 const {
  companyName: cName,
  email: eMail,
  phone: pHone,
  selectName: sName,
  count: countNow,
  date: dateNow,
} = this.state;
return (
  // your JSX
);
  

Я предположил, что ваш компонент, отображающий ответ, совпадает с тем, из которого вы отобразили и отправили форму.

Комментарии:

1. Вы, очевидно, понимаете мою проблему. Я пытался деструктурировать, чтобы избежать возврата всех данных из ответа. Следуйте той самой ссылке на импорт, которую вы отправили в List и keys в react, я все еще пытался, но получаю все. Могу ли я получить совет о том, как решить вторую проблему, о которой вы упомянули. Есть ли документация, которую я могу использовать для устранения этой второй проблемы? @Benito

2. Разве вы не можете просто избежать выполнения axios.get("/api") вызова? Я не думаю, что вам это нужно. Это для немедленной обратной связи для пользователя? Если это так, то у вас уже есть вся информация о пользователе в вашем состоянии. Если вы не хотите отображать обратную связь в другом компоненте. В этом случае это было бы немного сложнее.