Телефонный номер пользователя не обновляется функцией Firebase Cloud. - PullRequest
1 голос
/ 15 апреля 2020

Я не думаю, что это спецификация Firebase c. Это может быть больше связано с ожиданием / обещанием, но я не могу понять это.

Написание функции Firebase, позволяющей авторизованному пользователю обновить другую учетную запись пользователя. Кажется простым Пожалуйста, обратите внимание на комментарии. Обратите внимание, что 1) старый телефонный номер не определен (как и ожидалось), 2) новый / переданный телефонный номер le git, 3) после назначения «новый» пароль все еще не определен. ПОЧЕМУ?!?!?

Чего мне не хватает ??? (Извините, я не могу сделать этот вопрос более кратким!)

module.exports = functions.https.onCall(async (data, context) => {
  var targetUser = await admin.auth().getUser(data.targetUser.uid)
  // Following rule might not make sense! But it works. We know cuz the following later logs output correctly!
  if (
    Boolean(targetUser) && Boolean(context.auth) &&
    Boolean(context.auth.token.companyToken) &&
    (Boolean(context.auth.token.isAdmin) || context.auth.email === targetUser.email)
  ) {
    // Log output appears from the following!
    console.log(`Phone was ${targetUser.phoneNumber}`) // "Phone was undefined" - expected!
    console.log(`Passed-in Phone is ${data.targetUser.phoneNumber}`) // "Phone is (402)555-1212" - Yep!
    // Again, ignore the logic here. It's working! I get the embedded log output
    if (context.auth.email === targetUser.email || context.auth.token.companyToken === targetUser.customClaims.companyToken) {
      // the following appears to not execute! I expect targetUser.phoneNumber to be updated!
      // ... it SHOULD become data.targetUser.phoneNumber (i.e. "(402)555-1212")
      targetUser.phoneNumber = (data.targetUser.phoneNumber ? data.targetUser.phoneNumber : targetUser.phoneNumber)
      console.log(`Phone NOW ${targetUser.phoneNumber}`) // "Phone is NOW undefined"
      // WTF?!?!? It's still undefined?!?!?
      // THIS IS MY PROBLEM RIGHT HERE! WHY IS phoneNumber STILL UNDEFINED?!?!?!
      // You can ignore the rest...
      return updateUser(targetUser).then(() => {
        return {
          success: true
        }
      })
      .catch((e) => {
        return {
        // yadda yadda
        }
      })
    }
  }
  throw new functions.https.HttpsError(
    "not-authorized",
    "Requestor is not authorized to perform this operation on the target user."
  )
})

Ответы [ 2 ]

3 голосов
/ 15 апреля 2020

Это потому, что targetUser является UserRecord (Обещание, возвращаемое методом getUser(), разрешается с UserRecord), и вы не можете обновить UserRecord как простой JavaScript Объект.

Вам необходимо вызвать метод updateUser() следующим образом:

const newPhoneNumber = '.....';
const newUserRecord = await admin.auth().updateUser(data.targetUser.uid, {phoneNumber: newPhoneNumber})
console.log(newUserRecord.phoneNumber);

Кроме того, обратите внимание, что вы смешиваете использование async/await с методом then(), который не рекомендуется.

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

Проблема с не вашим кодом. Проблема с объявлением переменной, пожалуйста, используйте let вместо var, и вы уже в пути.

module.exports = functions.https.onCall(async (data, context) => {
  //var targetUser = await admin.auth().getUser(data.targetUser.uid);
  // declare the targetUser with let instead of var.
  let targetUser = await admin.auth().getUser(data.targetUser.uid);
  //following later logs output correctly!
  if (
    Boolean(targetUser) && Boolean(context.auth) &&
    Boolean(context.auth.token.companyToken) &&
    (Boolean(context.auth.token.isAdmin) || context.auth.email === targetUser.email)
  ) {
    // Log output appears from the following!
    console.log(`Phone was ${targetUser.phoneNumber}`) // "Phone was undefined" - expected!
    console.log(`Passed-in Phone is ${data.targetUser.phoneNumber}`) // "Phone is (402)555-1212" - Yep!
    // Again, ignore the logic here. It's working! I get the embedded log output
    if (context.auth.email === targetUser.email || context.auth.token.companyToken === targetUser.customClaims.companyToken) {
      // the following appears to not execute! I expect targetUser.phoneNumber to be updated!
      // ... it SHOULD become data.targetUser.phoneNumber (i.e. "(402)555-1212")
      targetUser.phoneNumber = (data.targetUser.phoneNumber ? data.targetUser.phoneNumber : targetUser.phoneNumber)
      console.log(`Phone NOW ${targetUser.phoneNumber}`) // "Phone is NOW undefined"
      // WTF?!?!? It's still undefined?!?!?
      // THIS IS MY PROBLEM RIGHT HERE! WHY IS phoneNumber STILL UNDEFINED?!?!?!
      // You can ignore the rest...
      return updateUser(targetUser).then(() => {
        return {
          success: true
        }
      })
      .catch((e) => {
        return {
        // yadda yadda
        }
      })
    }
  }
  throw new functions.https.HttpsError(
    "not-authorized",
    "Requestor is not authorized to perform this operation on the target user."
  )
})

Если у вас все еще есть проблемы, то дайте мне знать, что мы найдем другой способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...