У меня есть эта функция, которая должна получать реферальные коды от пользователей. Пользователь дает код, и реферальный код проверяется, существует ли он в базе данных, а затем оценивается, если
он не соответствует текущему пользователю, так что не следует ссылаться на себя и
это совпадение с одним из кодов в базе данных
Однако этот код просто не находит соответствия, даже если указанный код находится в базе данных. Если реферальный код совпадает с реферальным кодом текущего пользователя, он работает корректно и указывает на это, т.е. нельзя ссылаться самостоятельно.
Но если реферальный код совпадает с реферальным кодом другого пользователя, как и должна работать реферальная система, он все равно говорит, что нет совпадения.
Как я могу удалить эту ошибку
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`
};
}
});
мне нужен только один result
из этого forEach
, то есть, если referralCode
совпадает, но не с текущим пользователем, или если referralCode
не совпадает. вот почему я поставил три проверки для этого
Это не отвечает на вопрос: если у вас есть несколько результатов из allUIDs
, вы получите последний результат, независимо от того, хотите вы этого или нет. Кажется, что простой отладки и/или console.infoging будет достаточно, чтобы решить эту проблему, какой бы она ни была.
Вы должны правильно делать отступы в своем коде, читать его больно и запутанно. Вероятно, вы получите ответ быстрее, представив читаемый код.
Мне нужно перебрать документы, полученные из базы данных. скажем, 10 документов, каждый с уникальным идентификатором. если пользователь дает код, который совпадает с тем, что находится в базе данных, 10 документов, он возвращает совпадение.
@Taio Это не то, что делает ваш код в настоящее время.
Мне тоже непонятно, что db.collection("user").doc(providedID).collection("referrals").doc(userID)
там делает.
Да, это не то, что он делает. И мне интересно, почему. Он находит own match
no match
, но не находит match
, даже если есть совпадение
Я закомментировал эту строку, она была там по ошибке
Вы не можете вернуться из forEach
. Вы должны объявить переменную вне цикла, установить ее внутри цикла и вернуть после цикла. Не устанавливайте переменную более одного раза в цикле; вам может потребоваться установить флаг, указывающий, что значение уже установлено. Или просто используйте цикл for
или for..of
.
Я сказал, почему: result
будет установлено последнее сравнение в вашем цикле forEach
. См. текущий комментарий в моем рефакторинге (который является ответом нет, но смотреть на ваш код было немного больно, поэтому мне пришлось сначала исправить его) и решить, что вы на самом деле хотите.
(Это не ответ, а простой рефакторинг.)
Вот что сейчас делает ваш код (примерно, я его не запускал):
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
будет установлен на то, что было в последнем сравнении. Возможно, это правильно, но:
Так:
any
.all
.map
вместо forEach
и соответствующим образом обрабатывать каждый результат, что бы это ни значило в вашем случае.В любом случае, я бы рекомендовал более четко разбивать ваш код. Будет намного легче рассуждать и исправлять.
Мне непонятно, что вы делаете - вы ожидаете множественных результатов для
forEach
? Если это так, вы перезаписываетеresult
на каждой итерации, поэтому это будет последнее условиеtrue
. Если нет, то может быть и нетforEach
, потому что это вводит в заблуждение. И я не понимаю, почему ты продолжаешь звонитьcheck
повсюду.