Проблемы с ответом из файла express во внешний интерфейс (React) - PullRequest
0 голосов
/ 10 марта 2020

Привет! Я создаю базовую c анкету на веб-сайте реагирования с полным стеком, который я создаю с использованием React, express и sql.

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

Это моя конечная точка express.

app.post("/post-question-answers", async (req, res) => {
  console.log("!called");
  try {
    await sql.connect(config);

    // create Request object

    let selectedWorkstation = req.body.selectedWorkstation;

    var request = new sql.Request();
    request.input(`SelectedWorkstation`, sql.NVarChar, selectedWorkstation);
    let existingWSA = await request.execute("dbo.CheckIfWSAExists");
    if (!existingWSA.recordset.length) {
      console.info("hello from first if");
      let user = req.body.user;
      let results = req.body.results;
      let completeToken = req.body.completeToken;
      let date = req.body.date;

      let questions = [];
      let answers = [];
      // let emails = [];
      let questionIds = [];
      let suggestedSoloutions = [];

      results.forEach(element => answers.push(element.answer));
      results.forEach(element => questions.push(element.question));
      // results.forEach(element => emails.push(element.email));
      results.forEach(element => questionIds.push(element.questionId));
      results.forEach(element =>
        suggestedSoloutions.push(element.suggestedSoloution)
      );

      var request = new sql.Request();
      request.input(`QuestionStatus`, sql.NVarChar, completeToken);
      request.input(`Date`, sql.NVarChar, date);
      request.input(`Email`, sql.NVarChar, user);
      request.input(`SelectedWorkstation`, sql.NVarChar, selectedWorkstation);
      let result = await request.execute("dbo.AddQuestionResponseHeader");

      console.log("HERE");
      console.log(result);
      if (result.hasOwnProperty("recordset") && result.recordset.length) {
        var recordsetRow = result.recordset[0];

        if (recordsetRow.hasOwnProperty("createdId")) {
          var id = recordsetRow.createdId;
          console.log(id);

          for (var i = 0; i < results.length; i++) {
            var request = new sql.Request();
            let answer = answers[i];
            let question = questions[i];
            // let email = emails[i];
            let questionId = questionIds[i];
            let soloution = suggestedSoloutions[i];

            request.input(`WSAId`, sql.Int, id);
            request.input(`Question`, sql.NVarChar, question);
            request.input(`Answer`, sql.NVarChar, answer);
            request.input(`Email`, sql.NVarChar, user);
            request.input(`QuestionId`, sql.NVarChar, questionId);
            // request.input(`CompleteToken`, sql.NVarChar, completeToken);
            request.input(
              `SelectedWorkstation`,
              sql.NVarChar,
              selectedWorkstation
            );
            request.input(`SuggestedSoloution`, sql.NVarChar, soloution);

            request.execute("dbo.SubmitQuestionResponses", function(
              err,
              recordset
            ) {
              if (err) console.log(err);
            });
          }
        } else {
          console.log("unexpected result format");
        }
      } else {
        console.log("No results found");
      }
    } else {
// HERE is what I am asking about
      console.info("This account exists");
      let errorMessage =
        "This Workstation currently has an assessment in progress";
      res.status(409).json({
        errorMessage: errorMessage
      });
    }
  } catch (e) {
    console.log(e);
  }
});

Так что это работает нормально, ответ находится в пределах финальной, иначе (где комментарий). Это достигается, когда рабочая станция существует и работает нормально. Затем я пытаюсь передать это сообщение об ошибке в этом другом месте.

Это мой оператор извлечения в моей функции отправки ответов

 submitAnswers() {
    let selectedWorkstation = window.localStorage.getItem("Workstation");
    let user = window.localStorage.getItem("User");

    let completeToken = "";
    let declinedCounter = 0;

    if (questionCounter == this.state.questions.length) {
      var today = new Date(),
        date = `${today.getUTCFullYear()}-${today.getUTCMonth() +
          1}-${today.getUTCDate()} ${today.getHours()}:${today.getMinutes()}:${today.getSeconds()}.${today.getMilliseconds()} `;

      for (var i = 0; i < results.length; i++) {
        if (results[i].answer == "P") {
          declinedCounter++;
        } else {
        }
      }

      if (declinedCounter > 0) {
        completeToken = "In Progress";
      } else if (declinedCounter <= 0) {
        completeToken = "Complete";
      }

      console.log(completeToken);
      const data = {
        completeToken,
        results,
        selectedWorkstation,
        date,
        user: user
      };

      fetch("/post-question-answers/", {
        method: "POST", // or 'PUT'
        headers: {
          Accept: "application/json,",
          "Content-Type": "application/json"
        },
        body: JSON.stringify(data)
      }).then(({ errorMessage }) => {
        this.setState({ errorMessage: errorMessage });
        alert(this.setState.errorMessage);


// Here is what I am referencing

        if (this.setState.errorMessage.length > 2) {
          alert("test1");
        } else if (this.setState.errorMessage.length < 2) {
          alert("test2");
        }
      });

      window.location.href = "http://localhost:3000/completed-assessment";
    } else {
      alert("Please enter all of The questions");
    }
  }

Это сообщение об ошибке сработало один или два раза при первом использовании. Тогда он либо не определен, либо ничего не предупреждает.

Я ищу причину, по которой это не отображается каждый раз, когда существует рабочая станция. Как это обычно не определено или не будет отображаться вообще.

Любая помощь будет принята с благодарностью.

1 Ответ

1 голос
/ 10 марта 2020

Вы неправильно обращаетесь к переменным состояния. Доступ к переменным состояния осуществляется с помощью this.state, а не this.setState.

Кроме того, поместите предупреждение в обратный вызов setState. setState является асинхронным, поэтому к тому времени, когда вы используете this.state.errorMessage внутри оповещения, оно, возможно, еще не было обновлено. Вместо этого попробуйте:

this.setState({errorMessage}, () => {alert(this.state.errorMessage)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...