我正在实现一个命令/响应模式,其中用户通过在他自己的userId下使用有效负载调用add
来写入命令集合,然后从类似的响应路径获取数据。
但是,下面的代码不起作用,因为onSnapshot无法侦听尚未创建的文档(command.id
集合中的文档/responses/{userId}/register
)。使用onCreate处理程序很容易解决这个问题,该处理程序存在于云函数中,但不适用于JS firebase客户端API。
这是使用redux-firestore和我的一些应用助手功能,但您会明白这一点。命令和响应文档结构使用{payload,error},类似于FSA
export const register = functions.firestore
.document("commands/{userId}/register/{commandId}")
.onCreate(async event => {
const payload = event.data.get("payload");
const { userId, commandId } = event.params;
const response = db.document(`responses/${userId}/register/${commandId}`)
// possibly something bad will happen
try {
// do something with payload...
return response.set({
payload: "ok" // or pass relevant response data
})
} catch(err) {
return response.set({
error: true
payload: error
})
}
});
export async function register(fs: any, userId: string) {
try {
// issue a new command
const command = await fs.add(
{ collection: `commands/${userId}/register` },
{ payload: fs.firestore.FieldValue.serverTimestamp() }
);
// wait for the response to be created
fs.onSnapshot(
{ collection: `responses/${userId}/register`, doc: command.id },
function onNext(doc) {
const {error, payload} = doc.data()
if (error) {
return notify.error({ title: 'Failed to register', message: payload.message });
}
notify.json(payload);
},
function onError(err) {
notify.error(err);
}
);
} catch (err) {
notify.error(err);
}
}
对于Web客户端,没有onCreate这样的东西吗?
我能想到的唯一可扩展的解决方案是将响应数据存储为命令文档中的子项,但我认为它不是那么好,因为我怀疑你不能将权限设置得那么严格。
我希望用户只能写入命令,并且只能从响应路径中读取。如果我把答案作为命令的孩子,我想这是不可能的?
我想知道我是不是忽略了一些API ...