当前位置: 首页 > 知识库问答 >
问题:

Firebase可调用函数响应不工作

顾穆冉
2023-03-14

我有一个简单的firebase functions脚本设置(运行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.on呼叫,但是,控制台说该功能不存在。

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

共有2个答案

饶高雅
2023-03-14

对于可调用函数。您需要创建一个函数,例如:

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方法。但请确保您正在服务器上处理COR。

在你的客户端。只需使用超文本传输协议客户端。

这http。使用函数url发布方法。

乜明朗
2023-03-14

您的函数是常规HTTP类型函数。然而,您的客户机代码试图调用它,就好像它是一个可调用类型的函数一样。那是行不通的。如果要调用可调用类型的函数,则必须根据文档实现该函数。

如果您需要将该函数保留为HTTP类型函数,则不能使用Firebase客户端SDK来调用它。只需像调用任何其他类型的HTTPendpoint一样调用它。

 类似资料:
  • 这是我的客户电话: My REACT_APP_FIREBASE_CALLABLE在本地设置为http://localhost:5001,部署时不使用。 我的firebase模拟器正在运行,它们在本地模拟我的函数: 我似乎无法让部署的版本调用函数。在日志中,函数根本没有被调用。 有人帮忙吗?

  • 我正在使用一个 DB2 数据库并测试了以下代码:无论方法 B 是否Propagation.REQUIRES_NEW,如果方法 B 有异常,则无论如何,方法 A 的结果都将正确提交。 这与我的假设相反,即必须使用Propagation.REQUIRES_NEW来实现这一目标。 谢谢你@Kayaman我想我现在已经想通了。 我看到的行为是因为methodB的@Transactional注释不起作用,所

  • 问题内容: 我有一个发送Ajax命令的系统,该命令返回一个带有功能的脚本块。将此数据正确插入DIV后,我希望能够调用此函数来执行所需的操作。 这可能吗? 问题答案: 我想以这种形式正确解释您的问题:“好的,我已经用完所有的Ajax东西了;我只想知道从那时起任何时候都可以调用插入到DIV中的JavaScript函数吗? ,也就是说,我不想在上下文中将其称为“回调返回”。 好的,如果您的意思是这样,那

  • 如果创建一个简单的并提供一个来返回一个,那么一切都能按照预期工作。 但是,如果我从更改为rxjava的,我会得到这个错误: 对代码进行了一些调试,我发现Jackson的以某种方式在其typeFactory中注册了、和其余的反应类型,因此稍后的知道如何(去)序列化它们。 但是,当我使用时就不是这样了:我在的类型工厂中找不到注册的或类型,因此我得到了前面提到的错误。 有人经历过这个问题吗?我错过了什么

  • 我正在从Flatter调用Firebase可调用函数,尽管我已经尝试了几乎所有的方法,但仍然无法处理可调用函数抛出的错误。 我的可调用函数如下所示: 然后,我在flatter中创建了一个Future来调用我的可调用函数: 最后,我用另一个错误处理程序从一个文本按钮调用我的未来: 当我调用我的函数并得到一个错误时,我的代码立即跳转到-并停止在-Flutter的(位于)。 它停在函数处的类,就在这里:

  • 我有一个内联变量函数内联int foo(…) 我需要调用一个宏(我们称它为宏),它也是可变的 基本上,我需要将其所有输入参数传递给宏。由于使用了选项,将重新定义为另一个宏将是一个简单的解决方案,但我还需要来返回值<注意:我正在尝试连接已编写代码的两部分,不允许更改它们<代码>foo(…) 用于代码的第一部分,宏定义于第二部分。我要做的唯一一件事就是定义一个使用宏的foo(),我不能,因为它们都是可