连接到Mongo时Catch失败
这个问题的答案:How to get node to exit when mongo connect fails包含连接的异步/等待代码
但是,我的代码(在节点v11.5.0和mongodb v3.1.13上运行)无法捕获:
(async function() {
let db;
try {
db = await MongoClient.connect(uri, { useNewUrlParser: true });
console.log("RETURN", db);
} catch (err) {
console.log('EXITING');
process.exit(1);
}
}());
为了证明我有意在没有证书的情况下给出一个uri:
MongoDB的://[email protected]:27017,cluster0-shard-00-01-z4j9e.azure.mongodb:27017,cluster0-碎片-00-02- z4j9e.azure.mongodb:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true
我得到的是这样的输出:
/Users/ekkis/dev/mongo/node_modules/mongodb/lib/topologies/replset.js:346 throw err; ^
MongoError:密码必须passwordDigest(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/auth/scram.js:63:43)在ScramSHA1.ScramSHA.auth(/用户/ ekkis的/ dev的字符串/mongo/node_modules/mongodb-core/lib/auth/scram.js:175:25)在身份验证(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/connection/pool.js:232:17 )在authenticateLiveConnections(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/connection/pool.js:819:7)在/用户/ ekkis的/ dev /蒙戈/ node_modules / mongodb的核/ LIB /连接/pool.js:864:5在pool.auth的waitForLogout(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/connection/pool.js:855:34)(/ Users / ekkis / dev /蒙戈/ node_modules / mongodb的核/ LIB /连接/ pool.js:862:3)在Server.auth(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/topologies/server.js:931: 20)在AUTH(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/topologies/replset.js:1474:19)在ReplSet.auth(/用户/ ekkis的/ dev /蒙戈/ node_modules / mongodb-核心/ lib中/拓扑/ replset.js:149 2:5)
因此,如果错误被捕获,控制台应该显示“退出”一词,但不会。另外,我认为抛出异常是因为否则返回的值将被打印,而不是
怎么会这样?我需要做些什么才能让它发挥作用?
*附录I *
事实上,承诺版本展示了相同的奇怪行为,它没有抓住:
MongoClient
.connect(uri, { useNewUrlParser: true })
.then(dbc => {
console.log('SUCCESS');
})
.catch(err => {
console.log('EXITING');
process.exit(1);
});
是的,我测试了回调版本,它也遭受同样的弊病。顺便说一下,为uri传递一个空字符串效果很好。我不明白
*附录II *
事实上,问题似乎与传递的凭证有关,即如果我通过:
MongoDB的:// X:Y @ cluster0-shard- [...]
我按预期捕获了“MongoError:身份验证失败”。通过:
MongoDB的:// @ cluster0-shard- [...]
有趣的是返回一个连接,但缺少“:”的凭据以这种奇怪的方式失败,所以:
mongodb:// ekkis @ cluster0-shard- [...]
未能抓住
回答如下:看起来像是一个bug,但MongoClient正在建立它的连接。您将无法使用try
和catch
来处理MongoClient代码中的异步抛出错误。
const {MongoClient} = require("mongodb");
process.on("uncaughtException", (err) => {
console.log("process err", err);
process.exit(1)
})
async function run () {
let db;
try {
// connection url will throw because password isn't provided
db = await MongoClient.connect("mongodb://myUsername:@localhost", { useNewUrlParser: true });
} catch (err) {
console.log('Exiting from thrown error', err);
process.exit(1);
}
}
run();
以下是发生了什么的简化示例 - 错误将最终“未捕获”并被uncaughtException处理程序捕获
process.on("uncaughtException", (err) => console.log("uncaught", err));
try {
setTimeout(() => {
throw new Error("asynchronously thrown error");
})
} catch (err) {
console.log("Error will not be caught here")
}
连接到Mongo时Catch失败
这个问题的答案:How to get node to exit when mongo connect fails包含连接的异步/等待代码
但是,我的代码(在节点v11.5.0和mongodb v3.1.13上运行)无法捕获:
(async function() {
let db;
try {
db = await MongoClient.connect(uri, { useNewUrlParser: true });
console.log("RETURN", db);
} catch (err) {
console.log('EXITING');
process.exit(1);
}
}());
为了证明我有意在没有证书的情况下给出一个uri:
MongoDB的://[email protected]:27017,cluster0-shard-00-01-z4j9e.azure.mongodb:27017,cluster0-碎片-00-02- z4j9e.azure.mongodb:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true
我得到的是这样的输出:
/Users/ekkis/dev/mongo/node_modules/mongodb/lib/topologies/replset.js:346 throw err; ^
MongoError:密码必须passwordDigest(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/auth/scram.js:63:43)在ScramSHA1.ScramSHA.auth(/用户/ ekkis的/ dev的字符串/mongo/node_modules/mongodb-core/lib/auth/scram.js:175:25)在身份验证(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/connection/pool.js:232:17 )在authenticateLiveConnections(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/connection/pool.js:819:7)在/用户/ ekkis的/ dev /蒙戈/ node_modules / mongodb的核/ LIB /连接/pool.js:864:5在pool.auth的waitForLogout(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/connection/pool.js:855:34)(/ Users / ekkis / dev /蒙戈/ node_modules / mongodb的核/ LIB /连接/ pool.js:862:3)在Server.auth(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/topologies/server.js:931: 20)在AUTH(/Users/ekkis/dev/mongo/node_modules/mongodb-core/lib/topologies/replset.js:1474:19)在ReplSet.auth(/用户/ ekkis的/ dev /蒙戈/ node_modules / mongodb-核心/ lib中/拓扑/ replset.js:149 2:5)
因此,如果错误被捕获,控制台应该显示“退出”一词,但不会。另外,我认为抛出异常是因为否则返回的值将被打印,而不是
怎么会这样?我需要做些什么才能让它发挥作用?
*附录I *
事实上,承诺版本展示了相同的奇怪行为,它没有抓住:
MongoClient
.connect(uri, { useNewUrlParser: true })
.then(dbc => {
console.log('SUCCESS');
})
.catch(err => {
console.log('EXITING');
process.exit(1);
});
是的,我测试了回调版本,它也遭受同样的弊病。顺便说一下,为uri传递一个空字符串效果很好。我不明白
*附录II *
事实上,问题似乎与传递的凭证有关,即如果我通过:
MongoDB的:// X:Y @ cluster0-shard- [...]
我按预期捕获了“MongoError:身份验证失败”。通过:
MongoDB的:// @ cluster0-shard- [...]
有趣的是返回一个连接,但缺少“:”的凭据以这种奇怪的方式失败,所以:
mongodb:// ekkis @ cluster0-shard- [...]
未能抓住
回答如下:看起来像是一个bug,但MongoClient正在建立它的连接。您将无法使用try
和catch
来处理MongoClient代码中的异步抛出错误。
const {MongoClient} = require("mongodb");
process.on("uncaughtException", (err) => {
console.log("process err", err);
process.exit(1)
})
async function run () {
let db;
try {
// connection url will throw because password isn't provided
db = await MongoClient.connect("mongodb://myUsername:@localhost", { useNewUrlParser: true });
} catch (err) {
console.log('Exiting from thrown error', err);
process.exit(1);
}
}
run();
以下是发生了什么的简化示例 - 错误将最终“未捕获”并被uncaughtException处理程序捕获
process.on("uncaughtException", (err) => console.log("uncaught", err));
try {
setTimeout(() => {
throw new Error("asynchronously thrown error");
})
} catch (err) {
console.log("Error will not be caught here")
}