首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Firebase云函数已完成,状态为''error'‘

Firebase云函数已完成,状态为''error'‘
EN

Stack Overflow用户
提问于 2018-06-02 06:13:25
回答 1查看 2.6K关注 0票数 1

我正在编写我的第一个云函数,当新用户注册我的android应用程序时发送推送通知。我已经完成了安装Node和firebase cli等基本操作,并初始化了我的项目。

我在下面编写了这个测试函数,用于记录任何注册并部署到firebase的用户的用户id及其令牌。

代码语言:javascript
复制
 exports.sendSignUpNotification =functions.database.ref('/users/{userId}').onWrite((change, context) => {
const user_id = context.params.userId;
//const notifID = context.params.notification_id;
console.log("User id at signup:\t", user_id);
//console.log("Notification id at signup:\t", notifID);

let token = admin.database().ref(`/users/{userId}/id_token`).once('value');
console.log("User id token:\t", token);

 return new Promise().then(data => {
    const payLoad = {
    notification: {
       title: "Thank You For Signing Up",
       body: "Enjoy the best features by becoming a premium user"
     }
   };
   return admin.messaging().sendToDevice(token, payLoad);
 }).catch(errs => {
  console.error("Error Sending Payload", errs);
});

});

这是完整功能的编辑代码,但不知何故,我知道我在发送有效负载时做错了什么。下面是我得到的错误:

代码语言:javascript
复制
TypeError: Promise resolver undefined is not a function
at exports.sendSignUpNotification.functions.database.ref.onWrite (/user_code/index.js:15:10)
at Object.<anonymous> (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:112:27)
at next (native)
at /user_code/node_modules/firebase-functions/lib/cloud-functions.js:28:71
at __awaiter (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:24:12)
at cloudFunction (/user_code/node_modules/firebase-functions/lib/cloud-functions.js:82:36)
at /var/tmp/worker/worker.js:716:24
at process._tickDomainCallback (internal/process/next_tick.js:135:7)

为了在客户端获得令牌,我在注册时调用了这个方法:

代码语言:javascript
复制
mAuth.getCurrentUser().getIdToken(true).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
                            @Override
                            public void onComplete(@NonNull Task<GetTokenResult> task) {
                                if (task.isSuccessful()) {
                                    String idToken = task.getResult().getToken();
                                    Log.d(TAG, "idToken:\t" + idToken);

                                    HashMap<String, String> usersMap = new HashMap<>();
                                    usersMap.put("name", name);
                                    usersMap.put("userId", userId);
                                    usersMap.put("email", email);
                                    usersMap.put("id_token", idToken);
          }

我已经保存了这个令牌,并在我的云函数脚本中引用了它。这是正确的令牌,还是应该使用FirebaseInstanceIdService中的令牌,如下所示:

代码语言:javascript
复制
@Override
public void onTokenRefresh() {
    super.onTokenRefresh();

    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed Token:\t" + refreshedToken);

}

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-02 06:26:29

您正在将旧的beta API与SDK的新1.x版本一起使用。数据库事件的工作方式已经改变。整个软件开发工具包的变化总结为here。onWrite事件现在接受两个参数,一个更改和一个上下文。更改包含之前和之后的快照,上下文包含通配符的值。

要获取userId通配符,您现在可以说:

代码语言:javascript
复制
exports.sendSignUpNotification = functions.database.ref(`/users/{userId}`).onWrite((change, context) => {
    const userId = context.params.userId

有关更多最新的示例,请参阅documentation

在你的代码中,这一行也有一个bug:

代码语言:javascript
复制
let token = admin.database().ref(`/users/{userId}/notificationTokens`).once('value');

反引号分隔字符串中的变量插值的JavaScript语法需要美元符号:

代码语言:javascript
复制
`/users/${userId}/notificationTokens`

这一行还有另一个bug。您并没有使用once()返回的promise来实际获取数据库中的值。token将包含该承诺,而不是数据库的内容。

您还必须返回一个promise,该promise将在函数中完成所有异步工作时进行解析,而您目前并没有这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50651565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档