首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有ESM的NodeJS :内部/流程/承诺:246个\ triggerUncaughtException(err,true /* fromPromise */) fromPromise finalizer.unsubscribe不是一个函数

带有ESM的NodeJS :内部/流程/承诺:246个\ triggerUncaughtException(err,true /* fromPromise */) fromPromise finalizer.unsubscribe不是一个函数
EN

Stack Overflow用户
提问于 2022-03-17 11:35:37
回答 1查看 3.1K关注 0票数 3

我正在使用ESMNodeJS中创建一个可观察 (RxJS)。在可观察到的中,我正在使用猫鼬执行查询。我得到了结果,但是控制台返回错误(在问题的末尾详细说明)。

我尝试用Javascript、、答应、来执行操作,试图用操作符来处理错误(,try,catch,)。

代码语言:javascript
复制
//-----------------------------------------------------------------//
// WITHOUT PROMISES:
//-----------------------------------------------------------------//
// Create observable obsAuth:
const obsAuth = new Observable(async (observer) => {
  try{
    const doc = await people.Model.findOne();
    observer.next(doc);
  } catch (err) {
      observer.error(err);
  }

  // Finish observer:
  observer.complete();
});

// Observe sub-element content (Subscribe):
let subAuth = obsAuth.subscribe({
  next: doc => {
    res.status(200).send({ success: true, people_data: doc });
    console.log(doc);
  },
  error: err => {
    res.status(500).send({ success: false, error: err });
    console.error('Error: ' + err);
  },
  complete: () => console.log('Suscripción finalizada')
});

// Unsuscribe:
subAuth.unsubscribe();
//-----------------------------------------------------------------//


//-----------------------------------------------------------------//
// WITH PROMISES:
//-----------------------------------------------------------------//
// Build people query:
const peopleQueryMongoDB = people.Model.findOne();

// Create observable obsAuth:
const obsAuth = new Observable(async (observer) => {
  // Excecute people query (Promise):
  await peopleQueryMongoDB.exec()
  .then((doc) => {
    observer.next(doc);
  })
  .catch((err) => {
    observer.error(err);
  });

  // Finish observer:
  observer.complete();
});

// Observe sub-element content (Subscribe):
let subAuth = obsAuth.subscribe({
  next: doc => {
    res.status(200).send({ success: true, people_data: doc });
    console.log(doc);
  },
  error: err => {
    res.status(500).send({ success: false, error: err });
    console.error('Error: ' + err);
  },
  complete: () => console.log('Suscripción finalizada')
});

// Unsuscribe:
subAuth.unsubscribe();
//-----------------------------------------------------------------//

在这两种情况下,我都有完全相同的行为。我得到了结果,并在控制台中出现了以下错误。

控制台错误:

代码语言:javascript
复制
node:internal/process/promises:246
          triggerUncaughtException(err, true /* fromPromise */);
          ^
Error
...
...
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  message: '1 errors occurred during unsubscription:\n' +
    '1) TypeError: finalizer.unsubscribe is not a function',
  errors: [
    TypeError: finalizer.unsubscribe is not a function
...
...
at processTicksAndRejections (node:internal/process/task_queues:96:5)
  ]
}

提前谢谢!

EN

回答 1

Stack Overflow用户

发布于 2022-04-29 07:07:01

昨天也经历过同样的问题。

您的代码的问题是,您给了可观察到的承诺作为Teardown逻辑。

重构代码的最简单方法是:

代码语言:javascript
复制
const obsAuth = new Observable((observer) => {
    (async () => {
        // Excecute people query (Promise):
        await peopleQueryMongoDB.exec()
        .then((doc) => {
            observer.next(doc);
        })
        .catch((err) => {
            observer.error(err);
        });

    })().then(ignored => observer.complete()) // Finish observer:
});

但你也可以用

代码语言:javascript
复制
fromPromise(peopleQueryMongoDB.exec())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71511646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档