首页 > 解决方案 > 我找不到使用 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

表示 ??

标签: node.jsexpressasync-awaitgremlin

解决方案


我不确定为什么,但是由于面临相同的问题,创建客户端变量的名称是有效的,但是当使用与文档相同的常量名称时,它就可以了

文档变量样本

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

推荐阅读