无法从 Node js 中的 firebase 通知回调函数捕获任何形式的错误或响应

unable to catch any form of error or response from firebase notification callback function in Node js

我正在使用“fcm-node”包来向特定设备 ID 发送通知。

sendNotification函数如下:

const FCM = require('fcm-node');
const serverKey = process.env.SERVER_KEY;
const fcm = new FCM(serverKey);

function sendNotification(registrationToken, title, body, type, key) {
    const message = {
        to: registrationToken,
        collapse_key: key,
        notification: {
            title: title,
            body: body,
            delivery_receipt_requested: true,
            sound: `ping.aiff`
        },
        data: {
            type: type,
            my_key: key,
        }
    };
    fcm.send(message, function (err, value) {
        if (err) {
            console.log(err);
            return false;
        } else {
            console.log(value);
            return value;
        }
    });
};

module.exports = {
    sendNotification
};

我用来调用这个函数的api函数如下:

router.get('/test', async (req, res, next) => {
  const promise = new Promise((resolve, reject) => {
    let data = sendNotification('', 'dfsa', 'asds', 'dfas', 'afsdf');
    console.log(data)
    if (data == false) reject(data);
    else resolve(data);
  });
  promise
    .then((data) => { return res.status(200).send(data); })
    .catch((data) => { return res.status(500).send(data) })
});

当我 console.log 来自 sendNotification 的“err”和“value”时,我得到以下之一:

{"multicast_id":4488027446433525506,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"0:1652082785265643%557c6f39557c6f39"}]};

{"multicast_id":8241007545302148303,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

如果成功,我确保设备正在接收通知。

问题出在 api 的数据中。它总是“未定义”,无论发送通知是否成功,我都会得到 200 Ok 状态。

好像是什么问题?

您不能 return 来自 node-style 异步函数的 function (err, value) {} 回调的任何内容。

您的 sendNotification() 函数需要 return 一个承诺。 util.promisify() 使得从 node-style 异步函数到 promise-returning 异步函数的转换很方便。注意return,这很重要:

const FCM = require('fcm-node');
const serverKey = process.env.SERVER_KEY;
const fcm = new FCM(serverKey);
const { promisify } = require('util');

fcm.sendAsync = promisify(fcm.send);

function sendNotification(registrationToken, title, body, type, key) {
    return fcm.sendAsync({
        to: registrationToken,
        collapse_key: key,
        notification: {
            title: title,
            body: body,
            delivery_receipt_requested: true,
            sound: `ping.aiff`
        },
        data: {
            type: type,
            my_key: key,
        }
    });
}

module.exports = {
    sendNotification
};

现在您可以随心所欲

router.get('/test', async (req, res, next) => {
  try {
    const data = await sendNotification('', 'dfsa', 'asds', 'dfas', 'afsdf');
    return res.status(200).send(data);
  } catch (err) {
    return res.status(500).send(err);
  }
});

也许它会有所帮助,首先尝试 return 你在 sendNotification 中的响应(承诺),因为实际上你有一个 void 函数,这就是为什么它总是未定义并且在你的路线之后

router.get('/test', async (req, res, next) => {
  try {
    const data = sendNotification('', 'dfsa', 'asds', 'dfas', 'afsdf');
    if (data) {
      return res.status(200).send(data);
    }
  } catch(err) {
      return res.status(500).send(err);
  }
});