如何在本地通过Node.js测试AWS Neptune数据库?
解决方案:Node.js连接AWS Neptune(无需手动SSH)
一、完全可行,两种实现方式
1. 将应用部署到Neptune所在VPC内
如果你的Node.js应用可以部署到Neptune同一VPC的EC2、ECS或EKS中,直接用AWS推荐的gremlin包连接Neptune的WebSocket端点即可,代码和标准Gremlin连接逻辑一致:
const gremlin = require('gremlin'); const { DriverRemoteConnection } = gremlin.driver; const { Graph } = gremlin.structure; async function connectToNeptune() { const connection = new DriverRemoteConnection( 'wss://your-neptune-endpoint:8182/gremlin', { mimeType: 'application/vnd.gremlin-v2.0+json' } ); const graph = new Graph(); const g = graph.traversal().withRemote(connection); try { const result = await g.V().limit(10).toList(); console.log('Query result:', result); } catch (err) { console.error('Connection error:', err); } finally { await connection.close(); } } connectToNeptune();
2. 用Node.js代码自动建立SSH隧道(适合本地开发/外部应用)
如果应用不在VPC内,可通过Node.js的SSH库(如ssh2)自动建立端口转发,将Neptune的8182端口映射到本地端口,再用gremlin包连接本地WebSocket端点,无需手动执行SSH命令:
先安装依赖:
npm install gremlin ssh2
再编写代码:
const gremlin = require('gremlin'); const { Client } = require('ssh2'); const { DriverRemoteConnection } = gremlin.driver; const { Graph } = gremlin.structure; // 跳板机(VPC内的EC2)配置 const sshConfig = { host: 'your-bastion-ec2-public-ip', port: 22, username: 'ec2-user', privateKey: require('fs').readFileSync('/path/to/your/private-key.pem') }; // Neptune集群端点配置 const neptuneConfig = { host: 'your-neptune-cluster-endpoint', port: 8182 }; // 本地转发端口 const localPort = 8182; async function connectWithSSHTunnel() { return new Promise((resolve, reject) => { const sshClient = new Client(); sshClient.on('ready', () => { console.log('SSH tunnel established'); sshClient.forwardOut( 'localhost', localPort, neptuneConfig.host, neptuneConfig.port, (err, stream) => { if (err) { sshClient.end(); return reject(err); } // 通过SSH隧道的流建立Gremlin连接 const connection = new DriverRemoteConnection( `ws://localhost:${localPort}/gremlin`, { mimeType: 'application/vnd.gremlin-v2.0+json', transport: () => stream } ); const graph = new Graph(); const g = graph.traversal().withRemote(connection); resolve({ g, connection, sshClient }); } ); }).on('error', reject).connect(sshConfig); }); } // 使用示例 async function runQuery() { let resources; try { resources = await connectWithSSHTunnel(); const result = await resources.g.V().limit(5).toList(); console.log('Query result:', result); } catch (err) { console.error('Error:', err); } finally { if (resources) { await resources.connection.close(); resources.sshClient.end(); } } } runQuery();
二、本地替代方案:Apache Gremlin Server
如果不想处理VPC/SSH的复杂性,Apache Gremlin Server是完全兼容Neptune的本地图数据库(Neptune基于TinkerPop Gremlin标准),可通过环境变量无缝切换开发与生产环境的连接:
- 用Docker快速启动本地Gremlin Server:
docker run -p 8182:8182 tinkerpop/gremlin-server:3.6.2
- 代码中通过环境变量切换连接:
const gremlin = require('gremlin'); const { DriverRemoteConnection } = gremlin.driver; const { Graph } = gremlin.structure; async function getGraphTraversal() { // 生产环境设置NEPTUNE_ENDPOINT,开发环境默认连接本地服务 const endpoint = process.env.NEPTUNE_ENDPOINT || 'ws://localhost:8182/gremlin'; const connection = new DriverRemoteConnection(endpoint, { mimeType: 'application/vnd.gremlin-v2.0+json' }); const graph = new Graph(); return graph.traversal().withRemote(connection); } // 环境变量配置示例: // 生产环境:export NEPTUNE_ENDPOINT="wss://your-neptune-endpoint:8182/gremlin" // 开发环境:无需设置,自动连接本地Gremlin Server
内容的提问来源于stack exchange,提问作者HunterWhiteDev
相关产品推荐
相关产品推荐

