【问题标题】:Firebase fuction returning "Response is not valid JSON object."Firebase 函数返回“响应不是有效的 JSON 对象”。
【发布时间】:2020-07-26 23:24:39
【问题描述】:

我正在尝试从我的vue 应用程序调用的firebase 函数发送电子邮件。我的 firebase 函数如下所示:

const functions = require('firebase-functions');
const admin = require("firebase-admin")
const nodemailer = require('nodemailer');

admin.initializeApp()


//google account credentials used to send email
var transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        user: 'xxxxx@gmail.com',
        pass: 'xxxxxxxxxx'
    }
});


exports.sendMail = functions.https.onRequest((req, res) => {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    const mailOptions = {
        from: `•••••••••@gmail.com`,
        to: req.body.email,
        subject: 'contact form message',
        html: `<h1>Order Confirmation</h1>
                            <p>
                               <b>Email: </b>"hello<br>
                            </p>`
    };


    return transporter.sendMail(mailOptions, (error, data) => {
        console.log("here")
        if (error) {
            return res.send({"data": error.toString()});
        }
        data = JSON.stringify(data)
        return res.send({"data": `Sent! ${data}`});
    });

});

我在这里删除了用户并传递了值。它们在我的代码中具有正确的值。我用来调用此函数的vue 方法如下所示:

sendEmail(){
        let sendMail = firebase.functions().httpsCallable('sendMail');
        sendMail(
            {
                email: 'xx@xx.xx.xx'
            }
        ).then(
            result => {
                console.log(result.data)
            }
        )
    }

调用此函数时,我在控制台中收到以下错误:

Uncaught (in promise) Error: Response is not valid JSON object.
at new e (index.cjs.js:58)
at t.<anonymous> (index.cjs.js:543)
at u (tslib.es6.js:100)
at Object.next (tslib.es6.js:81)
at s (tslib.es6.js:71)

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: javascript firebase vue.js google-cloud-functions


    【解决方案1】:

    您必须返回一个有效的JSON 结果,如下所示:

    return res.status(200).json({});

    这里是JSON is{},但也可以是{"status": "success}

    【讨论】:

    • 我将错误和成功都更改为return res.status(200).json({});,我得到`error: Response is missing data field。
    • 因此错误仍然来自解释响应的内容。它明确表示它正在等待响应中的字段数据,例如 return res.status(200).json({data: "mydata"});
    【解决方案2】:

    以防万一这有助于任何人在谷歌上搜索该问题,我得到“响应不是有效的 JSON 对象”。错误,因为我没有在客户端中指定正确的区域,并且我的函数未托管在默认的 us 区域中。我正在编写一个 react-native firebase 应用程序,所以我不得不改变:

    const result = await firebase.app().functions().httpsCallable("nameGoesHere");
    

    收件人:

    const result = await firebase.app().functions("europe-west1").httpsCallable("nameGoesHere");
    

    【讨论】:

      【解决方案3】:

      我无法从代码中判断是否是这种情况,但是当我将函数导出到一个文件中然后忘记将其包含在索引文件中时,这总是发生在我身上。

      【讨论】:

        【解决方案4】:

        问题可能出在处理程序上。您正在使用functions().httpsCallable('your_name'),但函数的句柄是onRequest。根据文档,应该有onCall函数处理程序。

        类似: exports.sendMail = functions.https.onCall((data) =&gt; { your_code_here });

        文档 - https://firebase.google.com/docs/functions/callable

        【讨论】:

          猜你喜欢
          • 2021-01-21
          • 2021-06-24
          • 2021-03-03
          • 2019-08-25
          • 1970-01-01
          • 1970-01-01
          • 2022-07-07
          • 2017-04-05
          • 2018-11-24
          相关资源
          最近更新 更多