#node.js #firebase #google-cloud-firestore #firebase-admin
# #node.js #firebase #google-облако-firestore #firebase-администратор
Вопрос:
Я пытаюсь использовать Firestore на AWS Lambda в Nodejs. Вот часть инициализации подключения к базе данных:
var admin = require('firebase-admin');
var serviceAccount = JSON.parse(process.env.cred);
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
});
var db = admin.firestore();
Но всякий раз, когда я пытаюсь выполнить операцию вставки, она не вставляет данные в «тестовую» коллекцию.
Код вставки:
async (events, context) => {
try {
var firestoreResult = await db.collection('packagescan12').add({
packageId: scan.packageId,
status: "unsynced",
timestamp: new Date()
});
console.log('Added document with ID: ', firestoreResult.id);
} catch(err) {
console.log("Error in inserting: ", err);
};
}
В журналах говорится 'Added document with ID: undefined'
Редактировать
Как указано в ответе, данном Фрэнком ван Пуффеленом, databaseURL
не требуется для инициализации приложения.
Журналы из CloudWatch при вставке двух документов в цикл:
Error in inserting: Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
at Object.callErrorFromStatus (/opt/nodejs/node_modules/@grpc/grpc-js/build/src/call.js:31:26)
at Object.onReceiveStatus (/opt/nodejs/node_modules/@grpc/grpc-js/build/src/client.js:176:52)
at Object.onReceiveStatus (/opt/nodejs/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:342:141)
at Object.onReceiveStatus (/opt/nodejs/node_modules/@grpc/grpc-js/build/src/client-interceptors.js:305:181)
at /opt/nodejs/node_modules/@grpc/grpc-js/build/src/call-stream.js:124:78
at processTicksAndRejections (internal/process/task_queues.js:79:11)
Caused by: Error
at WriteBatch.commit (/opt/nodejs/node_modules/@google-cloud/firestore/build/src/write-batch.js:426:23)
at DocumentReference.create (/opt/nodejs/node_modules/@google-cloud/firestore/build/src/reference.js:285:14)
at CollectionReference.add (/opt/nodejs/node_modules/@google-cloud/firestore/build/src/reference.js:2021:28)
at /var/task/index.js:170:80
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async AsyncIterableX.[Symbol.asyncIterator] (/opt/nodejs/node_modules/ix/asynciterable/operators/map.js:18:28)
at async Object.toArray (/opt/nodejs/node_modules/ix/asynciterable/toarray.js:18:22) {
code: 4,
details: 'Deadline exceeded',
metadata: Metadata { internalRepr: Map {}, options: {} },
note: 'Exception occurred in retry method that was not classified as transient'
}
Комментарии:
1. Пожалуйста, поделитесь своим кодом для вставки. Обратите внимание, что
databaseURL: "https://database_id_here.firebaseio.com"
это URL, соответствующий базе данных реального времени, а не Firestore.2. @RenaudTarnec Я внес изменения, а также отметил информацию о databaseURL. Я также добавил некоторую информацию о том же в редактировании.
3. Вы не видите новый документ в консоли Firestore??
4. Нет, я этого не делаю, как я упоминал ранее, там написано добавлено с идентификатором: undefined
5. Из кода, которым вы поделились, он должен быть сохранен в БД. Опять же, обратите внимание, что в Firebase есть две разные службы баз данных. Будьте осторожны, чтобы не перепутать RTDB и Firestore при просмотре консоли. Вы должны поделиться всем кодом, чтобы мы могли вам помочь .
Ответ №1:
Затем я попытался открыть databaseURL: «https://database_id_here.firebaseio.com » в браузере, и он говорит «не найден» в качестве ответа в браузере.
Это ожидаемое поведение. Firebase имеет две базы данных: Cloud Firestore и базу данных реального времени. Ваш код использует API Firestore, в то время как URL-адрес предназначен для базы данных реального времени, которая, по-видимому, никогда не создавалась для этого проекта.
Поскольку вы пытаетесь использовать Firestore только в своем коде, тот факт, что база данных в реальном времени не была создана, не является проблемой. На самом деле, я бы рекомендовал удалить этот URL из кода, поскольку он не нужен, и поскольку он смутил вас, он может смутить других.
Чтобы просмотреть свою базу данных Firestore, перейдите по адресу htts://firebase.google.com/console, выберите проект, а затем выберите Firestore в левой навигации.
Комментарии:
1. О, я вижу, теперь это имеет смысл. Я подумал, что
databaseURL
это может быть неправильно, и это приводит к неправильной настройке подключения к базе данных, поэтому данные не вставляются в коллекцию. Поскольку это больше не требуется, я отредактировал вопрос. Является ли add () не «ожидающим» для вставки и просто игнорирующим операцию? Я также опубликовал журналы возникновения ошибки.