Раньше мой код работал хорошо и возвращал значение Long для метки времени из хранилища огня. Начиная с выпуска firestore 1.0, код в качестве результата возвращает [object Object]. Хотя он сохраняет метку времени как June 5, 2018 at 10:38:44 AM UTC+3, что означает, что в настоящее время она не сохраняется как значение long в базе данных firestore. Я пробовал несколько возможных решений прошлой ночью, но не работал. Есть какое-нибудь решение?

exports.get_time = functions.https.onRequest((request, response) => {
    // if (!request.headers.authorization) {
    //     console.error('No Firebase ID token was passed');
    //     response.status(403).send('Unauthorized');
    //     return;
    // }
    var fieldValue = require("firebase-admin").firestore.FieldValue;
    db.collection('times').doc('servertime').set({servertime: fieldValue.serverTimestamp()}).then((ref) => {
        db.collection('times').doc('servertime').get().then((snapshot) => {
            response.writeHead(200, {"Content-Type": "text/plain"});
            response.write(String(snapshot.data()));
            response.end();
            return null;
        }).catch((error) => {
            response.writeHead(404, {"Content-Type": "text/plain"});
            response.write("Error\n" + error);
            response.end();
        });
        return null;
    }).catch((error) => {
        response.writeHead(404, {"Content-Type": "text/plain"});
        response.write("Error\n" + error);
        response.end();
    });
});
2
Geek Guy 5 Июн 2018 в 10:53

1 ответ

Лучший ответ

Проблема может быть связана с изменениями, внесенными в недавний выпуск Firestore SDK (версия 5.0.3 для JavaScript SDK):

В этом выпуске изменилось поведение объектов Date, хранящихся в Firestore: «временные метки, хранящиеся в Cloud Firestore, считываются обратно как объекты Firebase Timestamp, а не как системные объекты Date».

Вам необходимо «обновить код, ожидая, что вместо даты будет использоваться метка времени», как показано ниже:

  // Old:
  const date = snapshot.get('created_at');  // <- 'created_at' is an example of field name

  // New:
  const timestamp = snapshot.get('created_at');
  const date = timestamp.toDate();

Кроме того, вы должны несколько иначе связать свои обещания, а также изменить способ отправки ответа. Вы можете посмотреть следующее видео, чтобы узнать больше о том, как написать функцию HTTP: https: // www .youtube.com / watch? v = 7IkUgCLr5oA

exports.get_time = functions.https.onRequest((request, response) => {

    var fieldValue = require("firebase-admin").firestore.FieldValue;

    db.collection('times').doc('servertime').set({servertime: fieldValue.serverTimestamp()})
        .then((ref) => {

            return db.collection('times').doc('servertime').get();

        })
        .then((snapshot) => {
            response.send(snapshot.data());
            // return null;  no need to return here since it is an HTTP Function
        })
        .catch((error) => {
            response.status(500).send(error)
        });
}); 
3
Renaud Tarnec 5 Июн 2018 в 09:50