【问题标题】:Timestamp not working with firebase-functions-test时间戳不适用于 firebase-functions-test
【发布时间】:2020-03-11 00:34:48
【问题描述】:

我正在使用 firebase-admin 8.6.0 和 firebase-functions-test 0.1.6,它们在测试中支持 Firestore 时间戳(截至 0.1.5 https://github.com/firebase/firebase-functions-test/releases),但在尝试将它们与test.firestore.makeDocumentSnapshot 一起使用。

有人可以帮我理解我的实现中的错误吗?

import * as admin from 'firebase-admin';
admin.initializeApp();
const db = admin.firestore();
const settings = { timestampsInSnapshots: true};
db.settings(settings);

const timestamp = admin.firestore.FieldValue.serverTimestamp();
const testingTimestamp1 = admin.firestore.Timestamp.now();
const testingTimestamp2 = admin.firestore.Timestamp.fromDate(new Date);

import * as TestFunctions from 'firebase-functions-test';

const firebaseConfig = {
    databaseURL: 'https://...HIDDEN...',
    projectId: '...HIDDEN...',
    storageBucket: '...HIDDEN...appspot.com',
}

const test = TestFunctions(firebaseConfig, 'service-account-dev.json');

const data({
  timestamp,
  testingTimestamp1,
  testingTimestamp2,
});

const snap = test.firestore.makeDocumentSnapshot(data, path);

const wrapped = test.wrap(processImport);
await wrapped(snap, {params: testParams});

我无法让三个时间戳选项中的任何一个起作用。后一个我尝试在https://github.com/firebase/firebase-functions-test/pull/28 中向@the0rem 学习,但无济于事。我总是收到这个错误:

无法将 [object Object] 编码为 Firestore 值。本地测试尚不支持 Firestore 地理位置。`

【问题讨论】:

  • 什么是test?您是否错过了在某处显示导入?
  • 抱歉,@DougStevenson,我在编写问题时采取了一些捷径,因为我正在从多个文件中合成片段。我相信我现在拥有上面代码示例中的所有相关部分。
  • 只是为了确保 - 这个问题的标题是 @firebase/testing,它适用于 Web 客户端 SDK,但 firebase-functions-test 适用于在 Cloud Functions 上运行的后端代码。如果标题不一致,你能编辑一下吗?
  • 另外,如果您的问题确实与 firebase-functions-test 有关,请考虑在项目 GitHub 上发布错误报告。 github.com/firebase/firebase-functions-test
  • 好指点。我已经更改了标题,并考虑过发布错误报告,但是看到已经完成并且看似已解决和关闭,我认为这只是我不了解如何正确实施的问题。因此这里的帖子。

标签: javascript firebase testing google-cloud-firestore firebase-admin


【解决方案1】:

当我看到你的问题时,我很兴奋,因为我刚刚遇到了同样的问题。无论如何,这就是我最终解决它的方法。这是我从 Firestore 数据库中保存的 JSON 数据:

const customer = { 
    username: "A8tAz6wdtucMNKvWSgDkx4bquc2", 
    timestamp: { 
        _seconds: 1578762627, 
        _nanoseconds: 828000000 
    }, 
    role: "user" 
};

请注意,timestamp 只是一个具有两个属性的普通对象:_seconds_nanoseconds。这是错误“无法将 [object Object] 编码为 Firestore 值”的地方。来自即数据对象customer,包含另一个对象timestamp,Firestore 无法解析该对象。我们解决这个问题的方法是确保timestamp 不是一个普通对象,而是admin.firestore.Timestamp 的一个实例。以下是你的做法:

const seconds = customer.timestamp._seconds;
const nanosecs = customer.timestamp._nanoseconds;

// create a new Timestamp object passing in the required constructor arguments
const properTimestamp = new admin.firestore.Timestamp(seconds, nanosecs);
customer.timestamp = properTimestamp; // update the timestamp reference in your data object
// Now you can do this
test.firestore.makeDocumentSnapshot(customer, '/users/A8tAz6wdtucMNKvWSgDkx4bquc2')

现在,如果您执行console.log(customer);,您将看到时间戳对象是admin.firestore.Timestamp 的一个实例,这是控制台输出:

// OUTPUT
{
    username: 'A8tAz6wdtucMNKvWSgDkx4bquc2',
    timestamp: Timestamp { _seconds: 1578762627, _nanoseconds: 828000000 },
    role: 'user'
}

PS:我通过检查 Firebase 如何尝试解析数据中的值/对象得到了答案。这是解析失败并引发异常的地方(在文件中:../node_modules/firebase-functions-test/lib/providers/firestore.js:165:15):

if (val instanceof firebase_admin_1.firestore.Timestamp) {
        return {
            timestampValue: val.toDate().toISOString(),
        };
    }

【讨论】:

  • 我现在不在代码中,但下次我会确保验证它是否有效。看起来很有希望,谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-11-09
  • 2020-10-22
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多