云函数v1,通配符不在functions.firestore.onCreate中工作,空的context.params

时间:2018-04-07 09:33:35

标签: javascript firebase google-cloud-firestore google-cloud-functions

我将Firebase云功能更新到v1.0.1,并决定使用新的单元测试功能来实现它。

有一个问题我无法找到解决方案:

exports.updateBestTime = functions.firestore
   .document("users/{userId}/exercises/{exercise}/times/{timeId}")
   .onCreate((snap, context) => {

       console.log(context) 

       ...

调用此函数时,snap是正确的,snap.ref指向我传递的文档。应包含context.paramsuserIdexercise的通配符值的timeId为空。 这是console.log(context)

的输出
   { service: 'firestore.googleapis.com',
     name: 'projects/focos-debug/databases/(default)/documents/users/userId5/exercises/exercise4/times/timeId6' },
     eventType: 'providers/cloud.firestore/eventTypes/document.create',
     timestamp: '2018-04-07T09:17:42.500Z',
     params: {} }

我对JavaScript没有多少经验,所以这可能是我的错。你能帮帮我吗?

以下是我用于测试的代码:

const handstandTimePath = 'users/OLlJ3NFcgYXqS8T5vetYVKjzFbo1/exercises/handstand/times/test';

const snap = test.firestore.makeDocumentSnapshot(
    {time: 30},
    handstandTimePath
);

// Call the wrapped function with the constructed snapshot.
const wrapped = test.wrap(myFunctions.updateBestTime);
return wrapped(snap).then(function() {
    return firestore.doc(handstandTimePath).get();
}).then(function(createdSnap) {
    assert.property(createdSnap.data(), 'dateAndTime');
    assert.property(createdSnap.data(), 'time');
    assert.include(createdSnap.data(), {time: 30});
})

1 个答案:

答案 0 :(得分:0)

解决方案是将params作为附加参数传递给包装函数。

例如:

let data = test.database.makeDataSnapshot({
    valProp1: "hello",
    valProp2: 12345
}, "my/path/param1/param2");

await test.wrap(myFunctions.func1)(data,
    {
        params: {
            param1: userId,
            param2: orderId
        }
    });

如此issue中所示。