我有一个看起来像这样的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将我请求的文档作为对象打印出来,所以我不确定是什么问题?
答案 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中编码数据”。我认为这很容易在代码中被忽略。
我认为您必须仔细检查返回的所有数据。