K.W*_*.Wu 5 javascript elasticsearch firebase google-cloud-functions
我知道这个问题已经被问过好几次了,但这些解决方案并不适用于我的情况。我已经开始ElasticSearch,Kibana使用这两个命令:
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插件。我不明白为什么当我尝试从同一台服务器读取时,出现请求错误。
这就是答案。正如Frank van Puffelen和Doug 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,另一个为response。flashlight将监视您的 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)
| 归档时间: |
|
| 查看次数: |
7098 次 |
| 最近记录: |