0

我正在尝试将 node.js 应用程序(用 TS 编写)连接到 Yandex Cloud 的 MongoDB。我已通过以下方式成功连接mongosh

mongosh "mongodb://<user>:<pass>@<host>:<port>/?replicaSet=<rs>&authSource=<db>&ssl=true" \
   --tls --tlsCAFile ./YandexInternalRootCA.crt

其中 YandexInternalRootCA.crt 是下载的证书。现在我试图通过MongoClient这样的方式做同样的事情(代码改编自他们的示例;节点 v15.14.0,mongodb ^4.1.2):

import { MongoClient, Db } from 'mongodb'
import fs from 'fs'

const connnectionString = '<same connection string as the above argument of mongosh>'
const options = {
    useNewUrlParser: true,
    replSet: {
        sslCA: fs.readFileSync('./YandexInternalRootCA.crt')
    },
    //tlsInsecure: true,
}

const getStorage = async (): Promise<Db> => {
    // ts-ignore here is due to some typing problem: once you use 2 arguments
    // in .connect, TS shows that it promises void (which is not true)
    // @ts-ignore
    return (await MongoClient.connect(connnectionString, options)).db()
}

不经意间,这会导致

MongooseServerSelectionError:证书链中的自签名证书

我尝试添加tlsInsecure注释掉的显示位置(来自对猫鼬的建议),但这并没有什么不同。可能是什么原因,我该如何解决?

PS我也尝试过各种各样的事情,比如

const getStorage = async (): Promise<Db> => {
    return (await MongoClient.connect(config.mongo.connectionUri, {
        tls: true,
        //sslCA: fs.readFileSync('./YandexInternalRootCA.crt'),
        tlsCertificateFile: './YandexInternalRootCA.crt',
        tlsInsecure: true,
    })).db()
}

仍然给出相同的结果。

4

0 回答 0