首页 > 解决方案 > 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 函数中的日志记录可以工作,但会立即引发该错误。

标签: node.jsmongodbssh

解决方案


我没有使用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();

您出错的部分是将字符串传递给隧道包。它期望配置对象不是字符串。


推荐阅读