onCall云函数返回'数据不能以JSON编码。 NAN'

时间:2020-08-31 03:36:58

标签: javascript node.js firebase google-cloud-firestore google-cloud-functions

我有一个看起来像这样的onCall函数。

exports.getResults = functions.https.onCall((data, context) => {
  const isAdmin = context.auth.token.admin
  const uid = context.auth.uid
  const survey = db.collection('surveys').doc(data.surveyId)
  if (isAdmin || survey.owner === uid) {
       const userAnswers = db
      .collection('surveys')
      .doc(data.surveyId)
      .collection('submissions')

    return userAnswers
      .get()
      .then(querySnapshot => {
        return querySnapshot.docs.map(doc => {
          const userSubmission = doc.data()
          const submissionDoc = {
            userSubmission.answers,
            userSubmission.anonUser,
            userSubmission.timeInSurvey,
          }
          console.log('subDoc', submissionDoc)
    
          return submissionDoc
        })
      })
      .catch(error => {
        console.log(error)
      })
  } else {
    throw new functions.https.HttpsError(
      'permission-denied',
      'You do not have access to that survey',
    )
  }
})

我的console.log将我请求的文档作为对象打印出来,所以我不确定是什么问题?

1 个答案:

答案 0 :(得分:1)

我了解您在Firebase功能日志中有此错误。这意味着您正在返回NaN在对象中的某个位置。根据{{​​3}}文章:

要将数据发送回客户端,请返回可以JSON编码的数据。

这可能取决于实现方式,但是此处NaN不能用JSON编码。 (在this-数据类型和语法-数字中找到了有关它的信息。

您可以通过使用未初始化的变量部署函数来轻松复制此问题:

exports.getResults = functions.https.onCall(() => {
        var number;
        var value = number+1;
        return {
                value,
                "text": "test",
        };
})

在示例中,我添加了undefined来编号结果为NaN。当然,可能还有其他函数也将返回NaN。无论如何,如果您部署上面的示例,它将记录相同的错误“无法在JSON.NaN中编码数据”。我认为这很容易在代码中被忽略。

我认为您必须仔细检查返回的所有数据。