node.js - tunnel-ssh 连接后抛出错误
问题描述
我正在尝试使用隧道 ssh 包连接到 mongodb(mongodb 包)。它已连接,我可以记录数据库,但它会立即引发错误并断开连接。
buffer.js:705
throw new ERR_INVALID_ARG_TYPE(
^
TypeError [ERR_INVALID_ARG_TYPE]: The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type undefined
at Function.byteLength (buffer.js:705:11)
at SSH2Stream.directTcpip (D:\WORK\node_modules\ssh2-streams\lib\ssh.js:1128:23)
at openChannel (D:\WORK\node_modules\ssh2\lib\client.js:1142:21)
at Client.forwardOut (D:\WORK\node_modules\ssh2\lib\client.js:994:10)
at Client.<anonymous> (D:\WORK\node_modules\tunnel-ssh\index.js:16:23)
at Client.emit (events.js:223:5)
at SSH2Stream.<anonymous> (D:\WORK\node_modules\ssh2\lib\client.js:601:10)
at Object.onceWrapper (events.js:312:28)
at SSH2Stream.emit (events.js:223:5)
at parsePacket (D:\WORK\node_modules\ssh2-streams\lib\ssh.js:3911:10) {
code: 'ERR_INVALID_ARG_TYPE'
}
这是我的代码。
const tunnel = require("tunnel-ssh");
const config = require("config");
const MongoClient = require("mongodb").MongoClient;
const connection = new Promise((resolve, _) => {
// eslint-disable-next-line
tunnel(config.get("server"), async (err, server) => {
server.on("connection", console.log.bind(console, "server error"));
const client = await MongoClient.connect(config.get("mongodb").url, {
useUnifiedTopology: true,
useNewUrlParser: true
});
client.on("error", console.error.bind(console, "mongodb error"));
resolve({ client });
});
});
async function runQuery() {
const { client} = await connection;
console.log(client);
}
runQuery();
配置没有问题。事实上,runQuery 函数中的日志记录可以工作,但会立即引发该错误。
解决方案
我没有使用tunnel-ssh
您提到的软件包,但是我浏览了文档,发现您使用错误。我只是复制了文档中给出的配置tunnel-ssh
,它开始为我工作。粘贴下面的整个代码
const tunnel = require("tunnel-ssh");
const MongoClient = require("mongodb").MongoClient;
const connection = new Promise((resolve, _) => {
// eslint-disable-next-line
tunnel(
{
username: "root",
Password: "secret",
host: "127.0.0.1",
port: 22,
dstHost: "127.0.0.1",
dstPort: 27017,
localHost: "127.0.0.1",
localPort: 27000
},
async (err, server) => {
server.on("connection", console.log.bind(console, "server error"));
const client = await MongoClient.connect(
"mongodb://localhost:27017/user",
{
useUnifiedTopology: true,
useNewUrlParser: true
}
);
client.on("error", console.error.bind(console, "mongodb error"));
resolve({ client });
server.close();
}
);
});
async function runQuery() {
const { client } = await connection;
console.log("Connection Successful");
}
runQuery();
您出错的部分是将字符串传递给隧道包。它期望配置对象不是字符串。
推荐阅读
- amp-html - 从 AMP 缓存加载文章时不显示文章正文
- javascript - 获取元素的顶部位置值,然后在 JS 中为其添加百分比
- php - 以“格式”返回日期
本月” php - python - 在python中计算单词中字母之间的距离
- linux - Fedora 28 KDE 上的 Docker 容器没有互联网连接
- javascript - ng-view 未显示在 index html 页面中
- pulumi - pulumi:在`pulumi up`期间忽略手动删除的资源
- c# - 如何在 Xamarin 中恢复 Picker 的 ID
- python - multiprocessing.Pool:如何在旧进程完成时启动新进程?
- database - postgres delete 然后 pg_dump 转储已删除的数据