【问题标题】:tunnel-ssh throws an error after getting connectedtunnel-ssh 连接后抛出错误
【发布时间】:2020-02-19 14:52:39
【问题描述】:

我正在尝试使用隧道 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.js mongodb ssh


    【解决方案1】:

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

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

    【讨论】:

    • 奇怪的是 config.get("server") 返回一个对象但它不起作用。我通过将tunnel(config.get("server"), ... 更改为tunnel({...config.get("server")}, ... 来修复它
    猜你喜欢
    • 2015-07-09
    • 2016-06-14
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多