Переменная userFetched используется до назначения в облачные функции Firebase. - PullRequest
1 голос
/ 13 апреля 2020

Есть много похожих вопросов, но ни один из них не решает мой запрос.

Вот мой код:

if (commandFn === "/fetch") {
  let userFetched: string;
  returnText = `${commandFn} used with ${commandArg}`;
  admin.database
    .ref(`/Users/` + commandArg + "/userdata")
    .once("value")
    .then((snapshot) => {
      userFetched = snapshot.val().userdata;
    });

  return res.status(200).send({
    method: "sendMessage",
    chat_id,
    text: `${returnText} /n ${userFetched}`,
  });
}

Почему говорится, что переменная не назначена? В других функциях, где мне не нужно использовать функцию admin.database, я просто добавил оператор return в блок if.

В моем коде много операторов if-else, которые изменяют текст на вернулся, но та же ошибка. Поэтому я должен добавлять оператор return все время в каждый блок if-else.

Но когда я использую функцию admin.database, я не могу этого сделать. Я снова видел другие подобные ВОПРОСЫ, но они не отвечали на мои.

Это еще один кусок кода, сталкивающийся с той же проблемой:

let numberOfWords: number
    for (let index = 1 ; index <= userCommandSlicedLength; index++) {  
      let lastChar: string = '' 
      let currentChar: string = ''
      currentChar = userCommandSliced.charAt(index)
      lastChar = userCommandSliced.charAt(index-1)
      if (currentChar === " " && lastChar !== " ") {
        numberOfWords = numberOfWords + 1
      }  
      else if (currentChar === " " && lastChar === " ") {    // This is a test String.
       numberOfWords = numberOfWords + 0 
      }   
    }

    const finalNumberOfWords: number = numberOfWords

    console.log(`Number of words final are = ${finalNumberOfWords}`)

Проблема для второго кода:

src/index.ts:88:25 - error TS2454: Variable 'numberOfWords' is used before being assigned.

88         numberOfWords = numberOfWords + 1
                           ~~~~~~~~~~~~~

src/index.ts:91:24 - error TS2454: Variable 'numberOfWords' is used before being assigned.

91        numberOfWords = numberOfWords + 0
                          ~~~~~~~~~~~~~

src/index.ts:95:40 - error TS2454: Variable 'numberOfWords' is used before being assigned.

95     const finalNumberOfWords: number = numberOfWords

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Должен быть инициализирован значением, тогда только вы можете добавить значения

userFetched

объявлено как строка, мы не можем добавить объект, инициализировать его как объект.

и

numberOfWords

следует инициализировать с 0, чтобы вы могли увеличивать его

0 голосов
/ 13 апреля 2020

Переменная userFetched не определена, поскольку она назначается асинхронно в пределах Promise.then().

Следующий код должен работать, как и ожидалось.

if (commandFn === "/fetch") {
  let userFetched: string;
  returnText = `${commandFn} used with ${commandArg}`;
  admin.database
    .ref(`/Users/` + commandArg + "/userdata")
    .once("value")
    .then((snapshot) => {
      userFetched = snapshot.val().userdata;
      return res.status(200).send({
        method: "sendMessage",
        chat_id,
        text: `${returnText} /n ${userFetched}`,
      });
    })
    .catch((error) => console.error(error));
}

Редактировать на основе комментариев

Вот как я бы сделал это, чтобы сократить res.send операторов.

async function MyCloudFunction() {
  let userFetched: string;
  if (commandFn === "/fetch") {
    const snapshot = await admin.database
      .ref(`/Users/` + commandArg + "/userdata")
      .once("value");
    userFetched = snapshot.val().userdata;
  }
  //   DO OTHER STUFF
  return res.status(200).send({
    method: "sendMessage",
    chat_id,
    text: `${returnText} /n ${userFetched}`,
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...