Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 有没有办法不使用Nest.js中的async/await从数据库获取数据?_Node.js_Angular_Express_Nestjs - Fatal编程技术网

Node.js 有没有办法不使用Nest.js中的async/await从数据库获取数据?

Node.js 有没有办法不使用Nest.js中的async/await从数据库获取数据?,node.js,angular,express,nestjs,Node.js,Angular,Express,Nestjs,有没有办法使用回调函数在nest.js中使用typerm从数据库中获取数据并处理这些数据,然后我想发送一个响应。看起来typerm和大多数现代js软件包都是在只考虑承诺的情况下构建的。在大多数情况下,除非绝对必要,否则回调现在不会在许多程序中使用,因为承诺和async/await语法使代码比使用回调时可能进入的回调地狱更干净、更可读。它看起来确实接受回调,在recipes部分有一些关于的文档,答案是您可以使用可观察和/或承诺(异步等待)。我经常在包装器函数中使用一个可观察函数,然后承诺在管道中添

有没有办法使用回调函数在nest.js中使用typerm从数据库中获取数据并处理这些数据,然后我想发送一个响应。

看起来typerm和大多数现代js软件包都是在只考虑承诺的情况下构建的。在大多数情况下,除非绝对必要,否则回调现在不会在许多程序中使用,因为承诺和
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;
再说一遍,你可以把这个包起来。 另一个想法是使用RxJS
from
操作符(
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))
    )
}