有什么方法可以使用回调函数在nest.js中使用typeorm从数据库中获取数据并处理该数据,然后再发送响应。
答案 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
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