【问题标题】:Can't deploy Firebase Cloud Function due to error with JSON.stringify() error由于 JSON.stringify() 错误,无法部署 Firebase Cloud Function
【发布时间】:2019-01-21 16:15:49
【问题描述】:

我正在尝试为我的 react 本机应用程序部署一个云功能,当数据库中出现新节点时,它会向用户发送通知。为此,我正在使用 Expo 的 Push API,如下所示:https://docs.expo.io/versions/v32.0.0/guides/push-notifications 并遵循此处提供的教程:https://www.youtube.com/watch?v=R2D6J10fhA4

我已经能够获取设备令牌并将它们保存到我的数据库中。但是,由于出现以下错误,我无法将该函数部署到我的数据库中:

31:27 解析错误:Unexpected token, expected,

它在'body: JSON.stringify(messages)' 行抛出了一个致命错误,就好像它在'stringify' 之后需要一个逗号。我非常不确定如何从这里开始,并且似乎找不到任何解决此特定问题的帖子。

感谢任何帮助和/或建议!谢谢。

const functions = require('firebase-functions');

let fetch = require('node-fetch');

const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendPushNotification = functions.database.ref('Omicron-Pi')
.onCreate(event => {
  const root = event.data.ref.root;
  let messages = [];

  root.child('Omicron-Pi/profiles').once('value').then((snapshot) => {
    snapshot.forEach((childSnapshot) => {
      let pushToken = childSnapshot.val().pushToken;
        if (pushToken) {
          messages.push({
            to: pushToken,
            body: 'New Node added'
          });
        }
    });
    return Promise.all(messages);
  }).then(messages => {
    fetch('https://exp.host/--/api/v2/push/send', [
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(messages)
    ]);
  });
});

【问题讨论】:

    标签: javascript firebase-realtime-database firebase-cloud-messaging google-cloud-functions


    【解决方案1】:

    fetch() 的第二个参数是一个具有初始化属性的对象,但您传递的是一个数组。

    要修复它,请使用{} 而不是[]

    fetch('https://exp.host/--/api/v2/push/send', {
      method: 'POST',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(messages)
    });
    

    要了解更多信息,请阅读documentation on how to use fetch on MDN

    【讨论】:

    • 谢谢!这似乎解决了该错误,但现在出现了另外两个错误...“3:13 错误 'node-fetch' 应该列在项目的依赖项中。运行 'npm i -S node-fetch' 将其添加 import/no -extraneous-dependencies”和“14:3 error Expected catch() or return promise/catch-or-return” 我尝试为第一个错误运行“npm install -S node-fetch”,但不幸的是,它仍然存在。我不确定如何解决第二个错误。
    • 这似乎是一个完全不同的问题。您是否搜索过带有该错误消息的其他问题。他们一定会指向将node-fetch 模块添加到您的package.json 文件中。