如何使用 ElasticSearch 和 Firebase 解决“错误:连接 ECONNREFUSED 127.0.0.1:9200”?

K.W*_*.Wu 5 javascript elasticsearch firebase google-cloud-functions

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

bin/elasticsearch
bin/kibana
Run Code Online (Sandbox Code Playgroud)

并且服务器运行良好,使用浏览器转到 时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"
}
Run Code Online (Sandbox Code Playgroud)

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

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);
           });
});
Run Code Online (Sandbox Code Playgroud)

request模块安装在哪里yarn add request request-promise。然后,当Postman用于测试我的 API 时,我收到此错误:

在此处输入图片说明

我该如何解决?

更新

我也在flashlight使用 command运行node app.js。将新用户插入数据库时​​,新用户也会自动插入到 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());
});
Run Code Online (Sandbox Code Playgroud)

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

K.W*_*.Wu 1

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

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

exports.FB_REQ = 'search/request';
exports.FB_RES = 'search/response';
Run Code Online (Sandbox Code Playgroud)

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

新的downloadUserInfoAPI 应该是这样的:

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);
        });
});
Run Code Online (Sandbox Code Playgroud)