打字稿 – Firebase云功能 – 触发Expo SDK将通知推送给用户

我正在开发一个基于Expo的应用程序 – 我决定使用firebase作为后端,但是遇到了阻止程序,我需要向应用程序中的用户发送推送通知 – 但是Expo不适用于Firebase云消息传递( FCM)除非我弹出Expo项目并使用
Android和ios独立工作.

为了解决这个问题,我决定将Expo Notification Tokens存储在firebase中,然后在firebase中编写firebase云功能,从数据库中获取所有这些令牌,并使用expo-server-sdk触发sendPushNotificationAsync().

我知道要做到这一点,我的版本的firebase不能在Spark计划上 – 事实并非如此.

我决定在TypeScript中实现该解决方案,以便符合ES6 / ES7编码标准.

方法是 – 我触发对我的firebase函数url的get请求,这会触发执行的函数.使用下面的代码 – 当我针对提供的谷歌功能URL提出请求时,我收到错误消息:

@firebase/database: FIREBASE WARNING: Exception was thrown by user
callback. TypeError: expo.isExpoPushToken is not a function
at admin.database.ref.once (/user_code/lib/index.js:24:18)
at onceCallback (/user_code/node_modules/firebase-

有什么我做错了它似乎不能初始化和使用Expo导入的功能,虽然我已将其包含在package.json中进行安装,导入和使用.

index.ts – 由firebase生成

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
import * as Expo from 'expo-server-sdk';

admin.initializeApp();
// Create a new Expo SDK client
let expo = new Expo();

exports.pushNotifications = functions.https.onRequest((req,res) => {
  if(req.method !== 'GET'){
    return res.status(403).send('Forbidden!')
  }

  let allTokens = [];
  let messages = [];

  admin.database().ref('/all_user_push_tokens/').once('value', (snapshot) => {
    if(expo.isExpoPushToken(snapshot.val())){
      allTokens.push(snapshot.val())
    } else {
      console.log(snapshot.val())
    }
  })
  .then(() => {
    for (var token in allTokens){
      messages.push({
        to: token,
        sound: 'default',
        title: 'NXET',
        body: ' NEW ACTIVITIES ADDED!'
      })
    }
  })
  .then(() => {
    let chunks = expo.chunkPushNotifications(messages)

    async (chunks) => {
      for (let chunk of chunks) {
        try {
          await expo.sendPushNotificationsAsync(chunk);
        } catch (error){
          console.error(error);
        }
      }
    }

    return res.status(200).send('SUCCESS - NOTIFICATIONS SENT!!')

  })
  .catch(() => {
    return res.status(403).send('Forbidden!')
  });

  return res.status(200).send('Function Executing')

})

的package.json

{

"name": "functions",
  "scripts": {
    "build": "tsc",
    "serve": "npm run build && firebase serve --only functions",
    "shell": "npm run build && firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "main": "lib/index.js",
  "dependencies": {
    "expo-server-sdk": "^2.3.3",
    "firebase-admin": "~5.12.0",
    "firebase-functions": "^1.0.1"
  },
  "devDependencies": {
    "typescript": "^2.5.3"
  },
  "private": true
}

任何帮助将非常感激.

最佳答案 快速查看Expo服务器sdk,看起来isExpoPushToken是一个类方法而不是实例方法,因此你应该在类Expo上调用方法而不是实例expo(注意大写与小写).

Expo server sdk github page

// Check that all your push tokens appear to be valid Expo push tokens
if (!Expo.isExpoPushToken(pushToken)) {
  console.error(`Push token ${pushToken} is not a valid Expo push token`);
  continue;
}
点赞