【问题标题】:How to resolve 'Error: connect ECONNREFUSED 127.0.0.1:9200' using ElasticSearch with Firebase?如何使用 ElasticSearch 和 Firebase 解决“错误:连接 ECONNREFUSED 127.0.0.1:9200”?
【发布时间】:2018-07-01 17:14:41
【问题描述】:

我知道这个问题已经被问过好几次了,但解决方案并不适用于我的情况。我已经使用这两个命令启动了ElasticSearchKibana

bin/elasticsearch
bin/kibana

并且服务器运行良好,当使用浏览器访问http://localhost:9200时,我得到以下结果:

{
    "name" : "vg7RnLh",
    "cluster_name" : "elasticsearch",
    "cluster_uuid" : "gqDf0H67TxGZGYigAlu2mQ",
    "version" : {
        "number" : "6.1.2",
        "build_hash" : "5b1fea5",
        "build_date" : "2018-01-10T02:35:59.208Z",
        "build_snapshot" : false,
        "lucene_version" : "7.1.0",
        "minimum_wire_compatibility_version" : "5.6.0",
        "minimum_index_compatibility_version" : "5.0.0"
    },
    "tagline" : "You Know, for Search"
}

当使用kibana 时,一切正常。这里是我写的firebase云函数,如果有什么不对的地方,我想就在这里:

exports.downloadUserInfo = functions.https.onRequest((req, res) => {
    const { uid } = req.query;

    const searchConfig = {
        uri: 'http://localhost:9200/users/user/' + uid,
        method: 'GET'
    };

    request(searchConfig)
        .then((result) => {
           console.log(result);
           return res.status(200).send(result);
       })
           .catch((error) => {
               console.log(error);
               return res.status(400).send(error);
           });
});

其中requestyarn add request request-promise 安装的模块。然后,当使用Postman 测试我的 API 时,我得到了这个错误:

我该如何解决这个问题?

更新

我也在使用命令node app.js 运行flashlight。将新用户插入数据库时​​,新用户也会自动插入到 ElasticSearch 服务器(localhost),但是,当我尝试读取时,它会抛出请求错误

第二次更新

这是创建用户的 API:

exports.register = functions.https.onRequest((req, res) => {
    const { firstName, lastName } = req.body;

    admin.database().ref('users').push({ firstName, lastName })
        .then(() => res.status(201).send())
        .catch(() => res.status(400).send());
});

当这个 API 创建一个新用户时,这个用户会自动插入到我的本地 ElasticSearch 服务器,因为我正在使用flashlight 插件。我不明白为什么当我尝试从同一台服务器读取时,会出现请求错误。

【问题讨论】:

  • 您是否使用 firebase deploy 运行完全部署到 Cloud Functions 的代码?
  • @DougStevenson 是的,部署成功

标签: javascript firebase elasticsearch google-cloud-functions


【解决方案1】:

您的代码正在尝试访问本地主机:

uri: 'http://localhost:9200/users/user/' + uid,

这行不通:您不能只访问运行 Cloud Functions 的容器上的“随机”端口。

我的猜测是您在本地机器上运行 ElasticSearch,这就是 localhost 的意思。但要在 Cloud Functions 环境中运行代码,您需要在可公开访问的系统上运行 ElasticSearch,并在 uri 中指定该机器的 IP。

【讨论】:

  • 感谢您的回答。忘了说我也在运行flashlight插件,问题更新了
  • 抱歉,我真的不知道手电筒是什么,也不知道它与您的问题有何关系。我能真正告诉你的是,从已部署的 Cloud Function 向 localhost 发出请求是毫无意义的。
  • 您不能在 Cloud Functions 上运行任意 Node.js 程序(例如 ElasticSearch)。您需要为此提供自己的 Node.js 服务器,并将该服务器的 IP 地址连接到 uri
【解决方案2】:

Cloud Functions 在 Google 控制的服务器上运行。它们不在您的机器上运行(除非您使用本地仿真进行测试)。

您的函数正在“localhost”访问一个 URL:

const searchConfig = {
    uri: 'http://localhost:9200/users/user/' + uid,
    method: 'GET'
};

request(searchConfig).then(...)

在几乎所有上下文中,localhost 都表示 IP 地址 127.0.0.1 - 运行代码的同一台机器。当您的代码在 Cloud Functions 中运行时,这意味着 localhost 是运行您的代码的 Google 服务器实例。这肯定不是您想要的,不幸的是,您也无法访问在您的个人计算机上运行的服务。

【讨论】:

  • 感谢您的回答。忘了说我也在运行flashlight插件,问题更新了
【解决方案3】:

这就是答案。正如Frank van PuffelenDoug Stevenson 指出的那样,无论如何,我无法执行从已部署的firebase 函数到本地主机服务器的任何请求。

但在flashlight 插件的帮助下,我可以让我的本地主机服务器知道我现在要执行搜索操作。我所做的是在config.js 文件夹内的flashlight 文件中:

exports.FB_REQ = 'search/request';
exports.FB_RES = 'search/response';

这两行的作用是告诉我的数据库在数据库中创建一个名为search的表,该表有2个子表,一个名为request,另一个名为responseflashlight 将监视您的 firebase 数据库并更新 ES 服务器中的任何数据,除了您写入 search/request 表的内容。当你写入这个表时,flashlight 检测到它,它知道你现在要执行搜索操作,它会运行你放在 ES 服务器上的查询,然后将结果存储在 @987654333 @table,您只需收听该表中的更新,这将是您的搜索结果。

新的downloadUserInfo API 应该是这样的:

exports.downloadUserInfo = functions.https.onRequest((req, res) => {
    const { uid } = req.query;

    const key = admin.database().ref('search/request')
        .push({ index: 'users', type: 'user', q: uid }).key;

    admin.database().ref(`search/response/${key}`).once('value')
        .then((snapshot) => {
            return res.status(200).send(snapshot.val());
        })
        .catch((error) => {
            return res.status(400).send(error);
        });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-14
    • 2019-03-15
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2021-01-20
    • 2016-10-27
    相关资源
    最近更新 更多