Как мне записать идентификатор документа в сам документ с помощью облачных функций?

#typescript #firebase #google-cloud-firestore #google-cloud-functions

#typescript #firebase #google-cloud-firestore #google-cloud-функции

Вопрос:

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

Ошибка типа: не удается прочитать свойство ‘resourcePath’ из undefined в doc (/workspace/node_modules …)

Причина, по которой я хочу сделать это таким образом, заключается в том, что я хочу иметь возможность сохранять идентификатор документа внутри самого документа. Это будет служить «указателем строки», как в SQL — уникальный способ идентификации строки в коллекции.

Код:

 exports.newUserSignup = functions.auth.user().onCreate(user => {
  console.log('user created', user.email, user.uid);
  const doc = admin.firestore().collection('users').doc
  return doc(user.uid).set({
    createDate: admin.database.ServerValue.TIMESTAMP,
    modifiedDate: admin.database.ServerValue.TIMESTAMP,
    username: 'blah',
    email: user.email,    
    stat: 1,
    uid: user.uid,
    rowpointer: doc().id,
  });
});
 

Ответ №1:

Вы почти на месте, но в вашем коде есть несколько синтаксических ошибок. Это должно быть ближе:

 exports.newUserSignup = functions.auth.user().onCreate(user => {
  console.log('user created', user.email, user.uid);
  const doc = admin.firestore().collection('users').doc();
  return doc.set({
    createDate: admin.database.ServerValue.TIMESTAMP,
    modifiedDate: admin.database.ServerValue.TIMESTAMP,
    username: 'blah',
    email: user.email,    
    stat: 1,
    uid: user.uid,
    rowpointer: doc.id,
  });
});
 

Я настоятельно рекомендую держать справочные документы под рукой, когда у вас возникают проблемы с этим типом упражнений, поскольку я довольно быстро обнаружил проблему, просмотрев CollectionReference.doc() и DocumentReference

Комментарии:

1. Отличный совет, я действительно забыл открыть их сегодня. Похоже, что это сработало, но для 2 полей даты он написал .sv: «временная метка» вместо фактической временной метки: imgur.com/xaNx7rq Знаете ли вы, почему он мог это сделать?

2. Не сразу, но это тоже кажется отдельной проблемой. Я рекомендую открыть новый вопрос для этой проблемы, а также показать, как вы admin туда импортируете.

3. Ах, я только что заметил это: вы используете admin.database.ServerValue.TIMESTAMP , и так и должно быть admin.firestore.FieldValue.serverTimestamp() .