我正在尝试将 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()
}
仍然给出相同的结果。