node.js - 我找不到使用 node/express 从 gremlin-server 获取数据的方法 - promise {} 永远
问题描述
在你读得太远之前,这个问题可能是关于 Node/Express 或者可能是关于 Gremlin - 我不知道是哪个原因?
在我作为 SU 的 Linux 机器上,我启动了 Janusgraph:(
docker run --name janusgraph-default --volume /home/greg/Downloads/gremlin:/dataImports janusgraph/janusgraph:latest
我挂载了一个本地文件夹,以获取air-routes.graphml
文件)
在同一个盒子上,在一个新终端中,我启动了 gremlin-server:(docker run --rm --link janusgraph-default:janusgraph -e GREMLIN_REMOTE_HOSTS=janusgraph -it janusgraph/janusgraph:latest ./bin/gremlin.sh
它给了我一个 gremlin 控制台)
从 gremlin 控制台,我可以运行:remote connect tinkerpop.server conf/remote.yaml
然后:> graph.io(graphml()).readGraph("/dataImports/air-routes.graphml")
最后::> g.V().has('airport','code','DFW').values()
,它按预期返回达拉斯沃思堡的详细信息。
在证明我已成功加载数据并可以从控制台查询数据之后,我想创建一个 Node/Express 程序,该程序最终将运行一些通常是静态的查询来构建一系列仪表板页面。
我拼凑了我的第一个 Express 应用程序:
const express = require('express');
const app = express();
const router = express.Router();
const gremlin = require('gremlin');
const traversal = gremlin.process.AnonymousTraversalSource.traversal;
const __ = gremlin.process.statics;
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const column = gremlin.process.column;
const direction = gremlin.process.direction;
const p = gremlin.process.P;
const textp = gremlin.process.TextP;
const pick = gremlin.process.pick;
const pop = gremlin.process.pop;
const order = gremlin.process.order;
const scope = gremlin.process.scope;
const t = gremlin.process.t;
// const tq = traversal().withRemote(new DriverRemoteConnection('ws://localhost:8182/gremlin'));
const tq = traversal().withRemote(new DriverRemoteConnection('ws://localhost:8182'));
const g = tq;
router.get('/home', (req,res) => {
res.send('<h1>Hello World,</h1><p>This is home router</p>');
});
// my first pass
// router.get('/query', async (req,res) => {
// const response = await gremlinQuery();
// //const response = gremlinQuery();
// const resp = res.send(response);
// });
//my second pass
router.get('/query', (req,res) => {
const response = gremlinQuery();
console.log(response);
const resp = res.send(response);
});
//<snipped out other router.gets>
app.use('/', router);
app.listen(process.env.port || 3000);
console.log('Web Server is listening at port '+ (process.env.port || 3000));
async function gremlinQuery() {
let results;
//function gremlinQuery() {
try{
const results = await g.V().has('airport', 'code', 'LHR').values().toList();
console.log(results);
//JsonConvert.DeserializeObject<results>(JsonConvert.SerializeObject(results2));
var arr = JSON.parse(results);
console.log('output: ' + arr);
return('output: ' + arr);
} catch (error) {
console.error(error);
}
}
代码中的查询在 gremlin-console 中返回预期结果,但在这段代码中(我在 VSCode 中以调试模式运行)它会在localhost:3000
没有预期 JSON 响应数据的情况下启动预期的网页,并且在调试终端上它会停止Promise {<pending>}
并且我不知道我是不是 a) 没有连接到 gremlin-server?b)弄乱了我的异步/等待(它在路由器函数调用的函数上可以吗?)c)其他
(不得不说,网络上并没有大量可供借鉴的 Node/Express/Gremlin/Janusgraph 示例。)
Docker 版本 19.03.11,构建 42e35e61f352
Linux xxxxxxxx 5.3.18-lp152.60-default #1 SMP 2021 年 1 月 12 日星期二 23:10:31 UTC 2021 (9898712) x86_64 x86_64 x86_64 GNU/Linux
gremlin> Gremlin.version() ==>3.4.6
节点--版本 v14.15.4
表示 ??
解决方案
我不确定为什么,但是由于面临相同的问题,创建客户端变量的名称是有效的,但是当使用与文档相同的常量名称时,它就可以了
文档变量样本
const authenticator = new Gremlin.driver.auth.PlainTextSaslAuthenticator(
`/dbs/${GREMLIN_DATABASE}/colls/${GREMLIN_GRAPH}`,
GREMLIN_PRIMARY_KEY
);
const client = new Gremlin.driver.Client(GREMLIN_ENDPOINT, {
authenticator,
traversalsource: "g",
rejectUnauthorized: true,
mimeType: "application/vnd.gremlin-v2.0+json",
});
推荐阅读
- javascript - 函数式编程免点更多参数
- ios - 邮递员给出不同的回应
- c++ - 通过 __VA_OPT__ 递归宏
- reactjs - React Native如何在数组中对象的属性(qtyCount)上设置状态
- javascript - 每页模板下拉焦点的 Primefaces 数据表行应该在顶部分页上
- python-3.x - Messenger 根据用户输入发送多个 Post 请求
- ios - Appcelerator 视频播放器显示媒体控件并且不播放声音
- javascript - 在网页中集成 Angular SPA - 请求建议
- kubernetes - 带有服务的 Kubernetes Cronjob
- docker - 使用 Sonatype nexus 控制对 docker 注册表的访问