Облачные функции: подробная трассировка стека: ошибка: не удается найти модуль 'fcm-push' - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь создать функцию, которая отправляет push-уведомление на устройство после получения токена устройства.Функция развернута правильно, но функция получает ошибки в журнале.Как я упоминаю ниже, ошибка

cannot find module fcm push 

Я пытался: -

$ install npm fcm-push
$ install npm fcm-push --save

Это не изменило ошибки.

Уведомление функции получает эту ошибку: -

{"@type":"type.googleapis.com/google.cloud.audit.AuditLog","status":{"code":3,"message":"Function load error: Code in file index.js can't be loaded.\nDid you list all required modules in the package.json dependencies?\nDetailed stack trace: Error: Cannot find module 'fcm-push'\n    at Function.Module._resolveFilename (module.js:476:15)\n    at Function.Module._load (module.js:424:25)\n    at Module.require (module.js:504:17)\n    at require (internal/module.js:20:19)\n    at Object.<anonymous> (/user_code/index.js:5:13)\n    at Module._compile (module.js:577:32)\n    at Object.Module._extensions..js (module.js:586:10)\n    at Module.load (module.js:494:32)\n    at tryModuleLoad (module.js:453:12)\n    at Function.Module._load (module.js:445:3)"},"authenticationInfo":{"principalEmail":"muddasar.pixster@gmail.com"},"serviceName":"cloudfunctions.googleapis.com","methodName":"google.cloud.functions.v1.CloudFunctionsService.UpdateFunction","resourceName":"projects/testingproject-80016/locations/us-central1/functions/Notificaation"}

Также я получаю это

 Code in file index.js can't be loaded.
Did you list all required modules in the package.json dependencies?
Detailed stack trace: Error: Cannot find module 'fcm-push'
at Function.Module._resolveFilename (module.js:476:15)
at Function.Module._load (module.js:424:25)
at Module.require (module.js:504:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/user_code/index.js:5:13)
at Module._compile (module.js:577:32)
at Object.Module._extensions..js (module.js:586:10)
at Module.load (module.js:494:32)
at tryModuleLoad (module.js:453:12)
at Function.Module._load (module.js:445:3)

Мой package.json

{
"name": "functions",
"description": "Cloud Functions for Firebase",
"scripts": {
"lint": "eslint .",
"serve": "firebase serve --only functions",
"shell": "firebase functions:shell",
"start": "npm run shell",
"deploy": "firebase deploy --only functions",
"logs": "firebase functions:log"
},
"dependencies": {
"firebase-admin": "~6.0.0",
"firebase-functions": "^2.0.3"
},
"devDependencies": {
"eslint": "^4.12.0",
"eslint-plugin-promise": "^3.6.0"
},
"private": true
 }

Мой код

 'use strict';

 const functions = require('firebase-functions');
 const admin = require('firebase-admin');
 exports.Notificaation = functions.firestore.document("Token/{token_id}").onWrite((change, context) => {


console.log('Toekn id', context.params.token_id);

const req = context.params.token_id;

        return admin.firestore().collection('UseData').doc(id).get()
            .then(snapshot => {
                const uid=snapshot.data().user_id;

                console.log("User id: ", uid);



                  return admin.firestore().collection('UserData').doc(uid).collection('Token').doc(req).get()
                  .then(snap=>
                    {


                            if(uid === null)
                            {
                              console.log("You are not logged in");
                            }
                            else
                            {
                               return admin.firestore().collection('UserData').doc(uid).collection('Join_members').get()
                               .then(snap=>
                                 {

                                      snap.forEach(doc =>{

                                         return admin.firestore().collection("Token").doc(doc.data().user).get()
                                            .then(snapshot2 =>
                                              {
                                               const tid2=snapshot2.data().token_id;

                                               console.log(" Token_id: ",tid2);


                                               const payload2= {
                                                   notification:{
                                                       title:"Notification",
                                                       body:"New Message.",


                                                     },

                                                   data:
                                                    {
                                                    user_id:id,

                                                     message:'1',

                                                   }

                                               };
                                                console.log(payload2);

                                               const options = {
                                                     priority: "high",
                                                     timeToLive: 60 * 60 *24,
                                                     content_available: true,
                                                    };




                                                 return admin.messaging().sendToDevice(tid2, payload2,options).then(result => {

                                                   var db = admin.firestore();

                                                   var data = {

                                                     type:'New Message Arrived',
                                                     status:1,
                                                     timestamp:admin.firestore.FieldValue.serverTimestamp()

                                                   };

                                                   var data1 = {
                                                      notifiction_message:0
                                                   };


                                                   var setDoc = db.collection('UserData').doc(doc.data().user).collection('notification').doc().set(data);

                                                   var setDoc1 = db.collection('UserData').doc(doc.data().user).update(data1);

                                                  return console.log('Notify when New Message ');

                                                 });
                                       });
                                       });
                                       console.log("Sucess");
                                       return true;

                                    });
                            }
                        return true;
                    });
          });
  });

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

вам может потребоваться добавить его в зависимости (что эквивалентно локальному npm install fcm-push):

"dependencies": {
    ...
    "fcm-push": "1.1.3"
},

, а затем потребовать его в коде:

var FCM = require('fcm-push');
0 голосов
/ 19 сентября 2018

Вам не нужно использовать модуль fcm-push в облачной функции.

Облачная функция будет использоваться только для отправки уведомлений.

Для получения FCMТокен клиентских устройств, вы должны реализовать определенный код на стороне клиента.

См. Следующий официальный пример Firebase, где они реализуют такой механизм: https://github.com/firebase/functions-samples/tree/master/fcm-notifications (версия для узла 6).

Посмотрите на следующий файл JS , где логика для отправки токена реализована в строках 184 - 211. Код вставлен ниже для дальнейшего использования.

В этом примере отправка уведомления инициируется, когда пользователь получает нового подписчика (см. index.js Файл облачных функций):

exports.sendFollowerNotification = functions.database.ref('/followers/{followedUid}/{followerUid}')
.onWrite((change, context) => {})

Поскольку вы указали (в комментариях), что хотите отправить уведомление «пользователям, которые входят в мое приложение», выследует создать собственный механизм триггера, поскольку для входа в систему нет готового триггера, см. Могут ли облачные функции для Firebase выполняться при входе пользователя в систему? .


Выдержка из примера кода для отправки токена:

// Saves the token to the database if available. If not request permissions.
Demo.prototype.saveToken = function() {
  firebase.messaging().getToken().then(function(currentToken) {
    if (currentToken) {
      firebase.database().ref('users/' + this.currentUid + '/notificationTokens/' + currentToken).set(true);
    } else {
      this.requestPermission();
    }
  }.bind(this)).catch(function(err) {
    console.error('Unable to get messaging token.', err);
    if (err.code === 'messaging/permission-default') {
      this.fcmErrorContainer.innerText = 'You have not enabled notifications on this browser. To enable notifications reload the page and allow notifications using the permission dialog.';
    } else if (err.code === 'messaging/notifications-blocked') {
      this.fcmErrorContainer.innerHTML = 'You have blocked notifications on this browser. To enable notifications follow these instructions: <a href="https://support.google.com/chrome/answer/114662?visit_id=1-636150657126357237-2267048771&rd=1&co=GENIE.Platform%3DAndroid&oco=1">Android Chrome Instructions</a><a href="https://support.google.com/chrome/answer/6148059">Desktop Chrome Instructions</a>';
    }
  }.bind(this));
};

// Requests permission to send notifications on this browser.
Demo.prototype.requestPermission = function() {
  console.log('Requesting permission...');
  firebase.messaging().requestPermission().then(function() {
    console.log('Notification permission granted.');
    this.saveToken();
  }.bind(this)).catch(function(err) {
    console.error('Unable to get permission to notify.', err);
  });
};
...