tunnel-s sh выдает ошибку после подключения - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь подключиться к mongodb (пакет mongodb), используя пакет tunnel-s sh. Он подключается, и я могу записать в БД, но он немедленно выдает ошибку и отключается.

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 работает, но немедленно выдает эту ошибку.

1 Ответ

1 голос
/ 19 февраля 2020

Я не использовал упомянутый вами пакет 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();

Часть, в которой вы ошиблись, передает строку в пакет туннеля. ожидается, что объект конфигурации не строка.

...