我更新了我的mongodb驱动程序,这迫使我使用两个完成块:. then(). catch()而不是一个回调.这样做的结果是,堆栈中的任何错误都将返回到mongodb. catch(),并可能再次级联进程.任何'done'块只应调用一次.当从单个回调迁移到then()和catch()两个块时,曾经很容易跟踪并且只被调用一次的代码失go 了简单性和连贯性.

  DB.insertOne(something).then( (r) => 
  {
    done({success:true}); 
  }).catch( (e) => 
  {
    done({success:false, message:e.code});
  });

我的问题是,一旦插入命令成功完成,是否有可能将catch块delete个?我之所以这么做是因为我不希望mongodb. catch()块在不相关和不相关的事件崩溃发生时执行.我正在寻找这样的东西.

  DB.insertOne(something).then( (r) => 
  {
    delete this.catch;//does not work
    done({success:true}); 
  }).catch( (e) => 
  {
    done({success:false, message:e.code});
  });

另外,我需要注意的是,一般来说,我确实需要catch块.我需要catch块执行once—例如,如果insert命令返回一个错误,试图插入同一文档与相同._ id(例如).

推荐答案

我看到了两个问题.

一方面,如果你想嵌套promise链,你可以这样做:

DB.insertOne(something)
  .then(r => {
    return Promise.resolve()
      .then(() => processResult(r))
      .then(() => done({success:true}))
      .catch(e => {
          console.log("Error in processResult():", e);
          done({success:false});
      );
  })
  .catch(e => done({success:false})); //only mongo error here 

另一方面,新的mongodb客户端旨在与JavaScript/await一起工作,目前JavaScript解释器已经广泛支持它.这避免了使用嵌套promise,并且更容易阅读和推理.下面是使用示例:

import mongo from 'mongodb';

async function main() {
    const client = new mongo.MongoClient('mongodb://localhost:27017', {});
    await client.connect();
    const collection = client.db('test').collection('test');
    try {
        return await collection.insertOne({hello: 'world'});
    } catch (e) {
        console.log("Error inserting",e);
    } finally {
        await client.close();
    }
}

console.log(await main());

注意,为了清楚起见,我避免了在connect()和close()周围使用try—catch,您可能需要根据需要调整捕获错误,语法与同步代码块完全相同.

Node.js相关问答推荐

在导入时未找到Pupeteer-PAGE-Proxy包

即使DDB键不存在, node Lambda也不会失败,并返回NULL作为结果

在Node.js下使用PostgreSQL客户端聚合PostgreSQL中的用户定义类型

Mongoose更新在^8.0.3版中,许多似乎不能按预期工作

聚合操作不返回任何具有mongoose模式的内容

关于Node.js中的AES加密库的问题

为什么我收到此错误:MissingSchemaError:架构尚未为模型&业务&注册

在Docker容器404页面中找不到服务器(提供静态reactjs文件)

如何使用Stripe测试失败的收费?

连接到在线 redis 数据库时出错

Jest - SyntaxError: 不能在@nestjs/axios 的模块外使用 import 语句

ResponseError:键空间ks1不存在

无法通过谷歌Electron 表格 api( node js)中的服务帐户访问写入

NestJS TypeORM 可选查询不起作用

NodeJs 过滤掉目录异步

Node.js 表达的 Error 对象expose 了哪些属性?

带有加密的nodejs中的SALT和HASH密码

如何在 node 中找到引用站点 URL?

NodeJS 中的 HTTPS 请求

Express js 阻止 GET /favicon.ico