javascript - 如何使用带有 Firebase 的 ElasticSearch 解决 'Error: connect ECONNREFUSED 127.0.0.1:9200'?

标签 javascript firebase elasticsearch google-cloud-functions

我知道这个问题已经被问过好几次了,但是解决方案并不适用于我的情况。我已经使用这两个命令启动了 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 cloud function,如果有什么不对的地方,我想是在这里:

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);
           });
});

其中 request 是由 yarn add request request-promise 安装的模块。然后,当使用 Postman 测试我的 API 时,出现此错误:

enter image description here

我该如何解决?

更新

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

第二次更新

这是创建用户的 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 插件。我不明白为什么当我尝试从同一台服务器读取时,出现请求错误。

最佳答案

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

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

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

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

关于javascript - 如何使用带有 Firebase 的 ElasticSearch 解决 'Error: connect ECONNREFUSED 127.0.0.1:9200'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392328/

相关文章:

javascript - import 语句中的解构赋值

javascript - 使用异步在 firebase.auth() 中捕获错误后获取 'Uncaught'

ruby-on-rails - Elasticsearch、轮胎与协会

java - 如何避免使用带有 firestore 的 snapshotListener 删除消息的 onEvent(QuerySnapshot snapshots, FirestoreException error) 调用?

android - 程序类型已经存在 : com. google.android.gms.internal.measurement.zzdz

elasticsearch - 如何使用命名空间和 SVC 在 Kubernetes 集群 pod 之间进行通信

ruby-on-rails - 如何使用SearchKick全面过滤结果(AND)

javascript - CSRF 禁止在我的注册表上显示,不知道为什么

javascript - Frisby.js:期望提供有效的 JavaScript 对象,但未定义

javascript - AngularJS 未将 html 加载到 ng-view 中