最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

连接到Mongo时Catch失败

IT培训 admin 4浏览 0评论

连接到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正在建立它的连接。您将无法使用trycatch来处理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正在建立它的连接。您将无法使用trycatch来处理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")
}

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论