有什么方法可以在不使用Nest.js中的async / await的情况下从数据库获取数据?

时间:2019-12-14 05:42:13

标签: node.js angular express nestjs

有什么方法可以使用回调函数在nest.js中使用typeorm从数据库中获取数据并处理该数据,然后再发送响应。

5 个答案:

答案 0 :(得分:2)

我不确定我是否正确理解了您的问题,但是您可以立即使用TypeORM(假设您使用的是SQL DB,Mongoose的工作原理与此类似)。存储库函数返回Promise<>,因此您可以使用类似的内容(来自docs):

return this.photoRepository
           .find()
           .then(result => {//... your callback code goes here...
            });

您可以将此代码包装在function getModifiedResult(cb){}中,并将回调传递给它。其次,请记住,async/await只是诺言的语法糖,因此上面的等价于:

result = await this.photoRepository.find();
cbAction = //... do something with your result here
return cbAction;

同样,您可以将其包装起来。 另一个想法是,使用RxJS from运算符(对于{6的RxJS版本为fromPromise)将诺言包装在Observable中。然后,您可以将回调放入订阅中:

//... Note that this returns a subscription for you to unsubscribe.
return from(this.photoRepository
           .find()
           .then(result => result))
           .subscribe(result => //... your callback code
            );

但是,如果您沿着那条路线走,那么可能值得使用map, switchMap,...之类的RxJS运算符修改结果。

答案 1 :(得分:1)

答案是,您可以使用observables和/或promises(异步等待)。我经常将Observable用于包装函数,然后承诺在管道中进行其他工作。我不确定为什么我不对所有事物都使用可观察对象,但这并不重要。

TypeORM与Nestjs很好地集成在一起,文档显示了如何做基础。使用Postgres时,我试图找出数组的问题。 SO帖子和Github问题均未得到答复。

答案 2 :(得分:1)

您可以只使用rxjs中的from / of运算符。 例子

create(user: UserInterface): Observable<UserInterface> {
    return from(this.userRepository.save(newUser))
}

如果需要,您还可以通过管道发送结果

create(user: UserInterface): Observable<UserInterface> {
    return from(this.userRepository.save(user)).pipe(
          map((user: UserInterface) => user))
    )
}

答案 3 :(得分:0)

与Nest本身无关,这只是您编写代码和处理可能拥有的任何库的方式。假设您有一个具有回调的数据库获取功能:

function findUsersWithCallback(function callback() {
  // do something with db
  callback(err, results);
});

您可以使用util.promisify

将其包装到类似promise的函数中
const findUsersPromisified = require('util').promisify(findUsersWithCallback);

剩下的就是使用标准的Nest提供程序:

@Injectable() UsersService {
  findUsers() {
    return findUsersPromisified();
  }
}

现在,您的UsersService的行为与框架的其余部分类似,并且旧的基于回调的代码已经很好地包装了,因此您可以放心地忽略它。

答案 4 :(得分:-1)

看起来TypeORM以及大多数现代JS软件包都是在仅考虑了诺言的情况下构建的。除非绝对必要,否则在当今大多数程序中,除非有绝对必要,否则在大多数程序中都不会使用回调,因为Promise和async/await语法使代码比使用回调时可能输入的回调地狱更加整洁和可读性强。看起来sequelize确实接受了回调,并且在食谱部分中有一些有关how to use NestJS with Sequelize

的文档