Если еще в цикле возникают ошибки в машинописном тексте

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

  1. он не соответствует текущему пользователю, так что не следует ссылаться на себя и

  2. это совпадение с одним из кодов в базе данных

Однако этот код просто не находит соответствия, даже если указанный код находится в базе данных. Если реферальный код совпадает с реферальным кодом текущего пользователя, он работает корректно и указывает на это, т.е. нельзя ссылаться самостоятельно.

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

Как я могу удалить эту ошибку

export const getID = functions.https.onCall(async(data, context) => {
  const db = admin.firestore();
  const usersSnapshot = await db.collection("user").get();
  const allUIDs = usersSnapshot.docs.map(doc => doc.data().userID);

  const userID = context.auth.uid;
  const providedID = "cNx7IuY6rZlR9mYSfb1hY7ROFY2";


 //db.collection("user").doc(providedID).collection("referrals").doc(userID);

  await check();

  function check() {
    let result;
    allUIDs.forEach(idFromDb => {
      if (providedID === idFromDb && (idFromDb === userID)) {
        result = "ownmatch";
      } else if (providedID === idFromDb && (idFromDb !== userID)) {
        result = "match";
      } else {
        result = "nomatch";
      }
    });
    return result;
  }

  if (check() === "match") {
    return {
      message: `Match Found`,
    };
  } else if (check() === "ownmatch") {
    return {
      message: `Sorry, you can't use your own invite code`,
    };
  } else {
    return {
      message: `No User with that ID`
    };
  }
});

Мне непонятно, что вы делаете - вы ожидаете множественных результатов для forEach? Если это так, вы перезаписываете result на каждой итерации, поэтому это будет последнее условие true. Если нет, то может быть и нет forEach, потому что это вводит в заблуждение. И я не понимаю, почему ты продолжаешь звонить check повсюду.

Dave Newton 27.05.2019 16:37

мне нужен только один result из этого forEach, то есть, если referralCode совпадает, но не с текущим пользователем, или если referralCode не совпадает. вот почему я поставил три проверки для этого

Taio 27.05.2019 16:45

Это не отвечает на вопрос: если у вас есть несколько результатов из allUIDs, вы получите последний результат, независимо от того, хотите вы этого или нет. Кажется, что простой отладки и/или console.infoging будет достаточно, чтобы решить эту проблему, какой бы она ни была.

Dave Newton 27.05.2019 16:46

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

sjahan 27.05.2019 16:49

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

Taio 27.05.2019 16:49

@Taio Это не то, что делает ваш код в настоящее время.

Dave Newton 27.05.2019 16:53

Мне тоже непонятно, что db.collection("user").doc(providedID).collection("referrals"‌​).doc(userID) там делает.

Dave Newton 27.05.2019 16:57

Да, это не то, что он делает. И мне интересно, почему. Он находит own matchno match, но не находит match, даже если есть совпадение

Taio 27.05.2019 16:59

Я закомментировал эту строку, она была там по ошибке

Taio 27.05.2019 17:01

Вы не можете вернуться из forEach. Вы должны объявить переменную вне цикла, установить ее внутри цикла и вернуть после цикла. Не устанавливайте переменную более одного раза в цикле; вам может потребоваться установить флаг, указывающий, что значение уже установлено. Или просто используйте цикл for или for..of.

Heretic Monkey 27.05.2019 17:01

Я сказал, почему: result будет установлено последнее сравнение в вашем цикле forEach. См. текущий комментарий в моем рефакторинге (который является ответом нет, но смотреть на ваш код было немного больно, поэтому мне пришлось сначала исправить его) и решить, что вы на самом деле хотите.

Dave Newton 27.05.2019 17:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
11
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

(Это не ответ, а простой рефакторинг.)

Вот что сейчас делает ваш код (примерно, я его не запускал):

const resultMsgs = {
  nomatch:  'No User With That ID',
  ownmatch: 'Sorry, you can\'t use your own invite code',
  match:    'Match Found',
}

function check(uids, providedId, userId) {
  let result

  uids.forEach(idFromDb => {
    if (providedId !== idFromDb) {
      result = 'nomatch'
      return
    }

    if (userID === idFromDb) {
      result = 'ownmatch'
      return
    }

    result = 'match'
  })

  return result
}

export const getID = functions
  .https
  .onCall(async (data, context) => {
    const userId     = context.auth.uid
    const providedId = 'cNx7IuY6rZlR9mYSfb1hY7ROFY2'

    const db   = admin.firestore()
    const user = await db.collection('user').get()
    const uids = user.docs.map(doc => doc.data().userId)

    const checkResult = check(uids, providedId, userId)
    return { message: resultMsgs[checkResult] }
  })

(Я удалил кажущуюся ложной операцию сбора db.)

Ваш forEach перебирает все uuids, но result будет установлен на то, что было в последнем сравнении. Возможно, это правильно, но:

  • Если вы ищете совпадение Любые, это не то, что вам нужно.
  • Если вы ищете совпадения все, это не то, что вам нужно.
  • Если вы хотите сопоставить UUID прошлой, это то, что вам нужно, но странный способ сделать это.

Так:

  • Если вам нужны совпадения Любые, используйте... кхм любую форму функции any.
  • Если вам нужны совпадения все, используйте любую форму функции all.
  • Если вы хотите совпадение первый, просто проверьте первый элемент.
  • Если вам нужен полный задавать сравнений, вам нужно использовать map вместо forEach и соответствующим образом обрабатывать каждый результат, что бы это ни значило в вашем случае.

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

Другие вопросы по теме