【问题标题】:How to implement async calls to db [duplicate]如何实现对数据库的异步调用 [重复]
【发布时间】:2019-11-29 15:59:06
【问题描述】:

我需要帮助的朋友! 我需要在我的 REST API 中编写获取请求的函数。 在这个函数中,我需要通过 branchId 获取所有播放列表,并通过 playlistId 获取每个播放列表文件,并发送具有属性 [{playlist, files}, {playlist, files}, {playlist, files}] 的对象数组。

我认为我的函数需要是异步的。 我试了一下,但是当我想为每个播放列表获取文件时遇到了一些问题。

exports.findBranchePlaylists = async  function(req, res) {
    let data = [];
    let playlists = await Playlist.find({branch_id: req.params.branchId});
    playlists.forEach(async (playlist) => {
        let files = await File.find({playlistId: playlist._id });
        data.push({playlist, files});
    })
    res.send(playlists);
};

我知道这是错误的代码,我想告诉你,我想做什么。 这段代码只给我发这个 - []。

【问题讨论】:

  • forEach 不支持 async/await 语法。将您的代码放在 FOR 循环中,它应该可以按预期工作。

标签: node.js express mongoose promise async-await


【解决方案1】:

不需要异步,可以使用promise或者回调函数

exports.findBranchePlaylists = function(req, res) {
Playlist.find({branch_id: req.params.branchId})
        .then(result => {
    return result.map(plylist => {
         File.find({playlistId: playlist._id })
              .then(result => { return {playlist, result} })
    })
}).then( result => res.send(result))
};

或者您可以将 for 循环与 async/await 一起使用,因为 async/await 不支持 forEach。

【讨论】:

  • 它不起作用,它给了我一个空数组
  • 变量名可能有错别字,请仔细查看。发现一个错字并更新了答案,更新了答案。
  • 是的,我看到了 typeos,但它仍然不起作用
  • 你正在为一系列承诺创建一个承诺 - 看起来你错过了一个 Promise.all 电话
  • 通过更简单的 async/await 语法使用 Promise 有什么问题?
【解决方案2】:

您的代码的问题是 forEach 循环不支持 await 语法(因为 forEach 不是异步的)。您可以将 forEach 更改为经典的 FOR 循环。 就我个人而言,我会这样做(所以 1 个电话会给我所有 id 的数据):

exports.findBranchePlaylists = async function(req, res) { let data = []; let playlists = await Playlist.find({branch_id: req.params.branchId}); let files = await File.find({'playlistId': {$in: playlists.map( ele => ele._id) }); res.send(files); };

【讨论】:

  • 它返回给我这个 []
  • 我将每个更改为 for 并且它有效,谢谢!!!!
猜你喜欢
  • 2016-12-20
  • 2015-05-13
  • 1970-01-01
  • 2022-07-25
  • 2014-07-16
  • 2017-02-03
  • 2019-08-03
  • 1970-01-01
  • 2016-01-01
相关资源
最近更新 更多