Firebase可调用函数响应不起作用

时间:2019-06-11 05:45:01

标签: javascript firebase google-cloud-functions

我有一个简单的firebase函数脚本设置(运行firebase-admin 8.0版和firebase-functions 2.3.1版):

const functions = require('firebase-functions');
const cors = require('cors')({
    origin: true,
});

//Gets and returns a user's ip address
exports.getIPAddress = functions.https.onRequest((req, res) => {
    let ipAddress = req.headers['fastly-client-ip'] || req.connection.remoteAddress;
    ipAddress = ipAddress.toString();
    console.log('Fetched IP Address: ' + ipAddress);
    return cors(req, res, () => {
        res.status(200).send(ipAddress);
    });
});

该功能的目标只是返回用户的IP地址。它可以在功能控制台中正常记录,没有错误。

这是客户端代码:

var getIPAddress = mainFirebase.functions().httpsCallable('getIPAddress');
function testIP() {
    getIPAddress().then(function(result) {
        console.log(result.data.text)
    });
}

但是,控制台说'result'不是有效的JSON对象。

我尝试过使用https.onCall,Internet上的其他人推荐使用该命令,但是控制台说该功能不存在。

任何帮助使响应正常工作的帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

您的函数是常规的HTTP类型函数。但是,您的客户端代码试图像调用可调用类型函数一样对其进行调用。那是行不通的。如果要调用可调用类型的函数,则必须实现函数according to the documentation

如果需要将该函数保留为HTTP类型函数,则不能使用Firebase客户端SDK调用它。只是invoke it as if it were any other type of HTTP endpoint

答案 1 :(得分:0)

用于可调用函数。您需要创建一个类似于

的函数
exports.addMessage = functions.https.onCall(
  async (data, context) => {
    // context contains the user info.
  }
);

在您的前端,您可以这样称呼他们:

firebase.functions().httpsCallable('addMessage');
addMessage({text: messageText}).then(function(result) {
  // Read result of the Cloud Function.
  var sanitizedMessage = result.data.text;
}).catch(function(error) {
  // Getting the Error details.
  var code = error.code;
  var message = error.message;
  var details = error.details;
  // ...
});

当您呼叫https消息时。您也可以使用SDK调用https方法。但是请确保您正在服务器上处理CORS。

在您的客户中。只需使用http客户端即可。

this.http.post方法带有函数url。