Node.js 有没有办法不使用Nest.js中的async/await从数据库获取数据?
有没有办法使用回调函数在nest.js中使用typerm从数据库中获取数据并处理这些数据,然后我想发送一个响应。看起来typerm和大多数现代js软件包都是在只考虑承诺的情况下构建的。在大多数情况下,除非绝对必要,否则回调现在不会在许多程序中使用,因为承诺和Node.js 有没有办法不使用Nest.js中的async/await从数据库获取数据?,node.js,angular,express,nestjs,Node.js,Angular,Express,Nestjs,有没有办法使用回调函数在nest.js中使用typerm从数据库中获取数据并处理这些数据,然后我想发送一个响应。看起来typerm和大多数现代js软件包都是在只考虑承诺的情况下构建的。在大多数情况下,除非绝对必要,否则回调现在不会在许多程序中使用,因为承诺和async/await语法使代码比使用回调时可能进入的回调地狱更干净、更可读。它看起来确实接受回调,在recipes部分有一些关于的文档,答案是您可以使用可观察和/或承诺(异步等待)。我经常在包装器函数中使用一个可观察函数,然后承诺在管道中添
async/await
语法使代码比使用回调时可能进入的回调地狱更干净、更可读。它看起来确实接受回调,在recipes部分有一些关于的文档,答案是您可以使用可观察和/或承诺(异步等待)。我经常在包装器函数中使用一个可观察函数,然后承诺在管道中添加工作。我不确定为什么我不在每件事上都使用可观察的东西,但这并不重要
TypeORM与Nestjs很好地集成在一起,文档展示了如何进行基本操作。不过,对于Postgres,数组存在一个问题,我正试图解决这个问题。一篇SO帖子和一个Github问题没有得到回答。我不确定我是否正确理解了您的问题,但开箱即用,您可以使用TypeORM(假设您使用SQL DB,但Mongoose的工作原理类似)。存储库函数返回一个
承诺
,因此您可以使用如下内容(从中):
您可以将此代码包装在函数getModifiedResult(cb){}中,并将回调传递给它。其次,请记住,async/await
只是承诺的语法糖,因此上述内容相当于:
result = await this.photoRepository.find();
cbAction = //... do something with your result here
return cbAction;
再说一遍,你可以把这个包起来。
另一个想法是使用RxJSfrom
操作符(fromPromise
对于RxJS版本<6),将promise封装在一个可观察的对象中。然后,您可以将回调放入订阅中:
//... Note that this returns a subscription for you to unsubscribe.
return from(this.photoRepository
.find()
.then(result => result))
.subscribe(result => //... your callback code
);
然而,如果您沿着这条路线走下去,那么使用RxJS操作符修改结果可能是值得的,比如
map、switchMap、
这与Nest本身没有多大关系,只是如何编写代码和处理可能有的库。假设您有一个带有回调的数据库获取函数:
function findUsersWithCallback(function callback() {
// do something with db
callback(err, results);
});
您可以将其包装成一个类似于promise的函数,比如说,util.promisify
const findUsersPromisified = require('util').promisify(findUsersWithCallback);
剩下的就是使用标准的嵌套提供程序:
@Injectable() UsersService {
findUsers() {
return findUsersPromisified();
}
}
现在,您的UsersService的行为与框架的其他部分类似,并且您的旧的基于回调的代码被很好地包装,因此您可以安全地忽略它。您可以使用rxjs中的from/of操作符。 范例
create(用户:用户界面):可观察{
从(this.userRepository.save(newUser))返回
}
如果你愿意的话,你也可以通过管道传递结果
create(user: UserInterface): Observable<UserInterface> {
return from(this.userRepository.save(user)).pipe(
map((user: UserInterface) => user))
)
}
create(用户:用户界面):可观察{
从(this.userRepository.save(user)).pipe返回(
映射((用户:用户界面)=>user))
)
}
Nestjs和TypeORM都使用可观察项。可观察项,是的,但一般回调,不是。RxJS被许多人(包括我自己)认为与JavaScript回调不同。.then()
,但为什么要这样做呢?我想返回查询回调的服务函数输出。如果我们对查询使用wait,那么我们的系统执行会等待它的输出,而不执行其他任务。如果是这样的话,我认为您没有正确使用wait。如果主键中的值重复,在wait中,我怎样才能捕捉到一个查询的错误?一个简单的try
/catch
在你的wait
s周围就可以了。别误会,我认为可观察到的东西很棒,功能也非常强大,但我不确定OP所寻找的答案是否就是将数据库调用封装在可观察到的东西中。我想他们更喜欢myRepository.create(myObject,(err,result)=>{})
风格的回调。Jay,我一直尊重你的意见。但几周前我用一个可观测的。我做了一些重构,回到了承诺,因为我已经有了那个代码。我是一个如此糟糕的开发人员,以至于每次我都会复制和粘贴我的旧代码并重用它,而不是采取新的观点。:-)我在使用可观察的或承诺方面没有问题,实际上我非常喜欢使用它们。我的大部分NestJS服务器都是使用可观察对象运行的。我想说的是,OP似乎在寻找常规的回调样式,传递一个函数来表示错误和完成情况,而不是将一个承诺函数包装在一个可观察函数中
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))
)
}