for循环中多个异步函数之后的NodeJS回调

2024-02-22

我从 mongodb 获取一个文档,其中包含一个带有该文档注释的数组。评论中是撰写评论的用户的 _id。

我现在需要根据用户的 _id 获取用户名,但遇到了几个问题。

我有以下代码,显然,它不起作用,但我希望它能让您了解我想要完成的任务。

//MORE CODE... (No need to show this here, just a promise, some try catch and so on)
let article = await Article.findOne({_id:articleid})   
    for(var i = 0; i<=article.comment.length-1; i++){
        User.findOne({_id:article.comment[i].user}).then((user)=>{
            article.comment[i].username = user.username
        })
    }
return resolve(article)

我查阅了几个文档,但无法找到可行的解决方案。我尝试使用 Promise.all,尝试了很多 async、await,尝试在 for 循环中添加一个计数器并在循环完成后解析 Promise,但到目前为止没有任何效果。

这就是文章在我的数据库中的样子

{
    "_id" : ObjectId("5c18c1cbc47e5e29d42e4b0e"),
    "completed" : false,
    "completedAt" : null,
    "comment" : [ 
        {
            "_id" : ObjectId("5c18c95e328c8319ac07d817"),
            "comment" : "This is a comment",
            "rating" : [ ],
            "user" : ObjectId("5c18b76e73236d2168eda2b4")
        }, 
        {
            "_id" : ObjectId("5c18fb578de5741f20a4e2bd"),
            "comment" : "Another comment",
            "rating" : [ ],
            "user" : ObjectId("5c18b76e73236d2168eda2b4")
        }
    ]
}

我对 Nodejs 和 mongodb 也很陌生,所以我希望你能帮助像我这样的新手。

感谢您的帮助


您可以根据自己的方便程度使用多种方法

使用异步等待

let article = await Article.findOne({ _id: articleid }).lean().exec()

await Promise.all(
  article.comment.map(async(obj) => {
    const user = await User.findOne({ _id: obj.user })
    obj.username = user.username
  })
)

console.log(article)

Using $lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/聚合3.6

既然mongodb有自己强大的$lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/聚合运算符连接多个集合,可能是无需任何迭代的更好方法

Article.aggregate([
  { "$match": { "_id": mongoose.Types.ObjectId(articleid) }},
  { "$unwind": "$comment" },
  { "$lookup": {
    "from": "users",
    "let": { "userId": "$comment.user" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$$userId", "$_id"] }}}
    ],
    "as": "comment.user"
  }},
  { "$unwind": "$comment.user" },
  { "$group": {
    "_id": "$_id",
    "comment": { "$push": "$comment" },
    "completed": { "$first": "$completed" },
    "completedAt": { "$first": "$completedAt" }
  }}
])

Using $lookup https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/聚合3.4

Article.aggregate([
  { "$match": { "_id": mongoose.Types.ObjectId(articleid) }},
  { "$unwind": "$comment" },
  { "$lookup": {
    "from": "users",
    "localField": "comment.user",
    "foreignField": "_id",
    "as": "comment.user"
  }}
  { "$unwind": "$comment.user" },
  { "$group": {
    "_id": "$_id",
    "comment": { "$push": "$comment" },
    "completed": { "$first": "$completed" },
    "completedAt": { "$first": "$completedAt" }
  }}
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

for循环中多个异步函数之后的NodeJS回调 的相关文章

  • 在使用 supertest 和 Node.js 的测试中,res.body 为空

    我正在测试 Node js API超级测试 https github com visionmedia supertest 我无法解释为什么res body对象超集返回为空 数据显示在res text对象 但不是res body 知道如何解决
  • Node.js + Socket.io + Windows 7 / 8?

    我一直在到处寻找 但似乎找不到解决方案 是否可以在 Windows 7 上的 Node js 上安装 Socket io 如果没有 是否有某种替代方案 或者您知道未来有任何 Windows 支持吗 通常使用 Node js 包管理器 但是我
  • 将 Node.js(用于实时通知)添加到现有 PHP 应用程序

    我有一个现有的 PHP 应用程序 我需要向其中添加实时通知 为了实现这一点 我安装了node js 打算添加socket io以实现所有实时功能 然而 尽管在过去的三个小时里研究并试图弄清楚如何将两者结合起来 但我发现自己并没有更接近于获得
  • Node.js 中没有请求状态 Morgan Logging

    我正在 Azure VM 上运行 node js 应用程序 使用 PM2 处理负载平衡和重新启动 这是服务器设置和日志记录代码 var logger require morgan var app express app set views
  • keystonejs 模型中的动态类型选择

    我想在 adminUI 中使用一个组合框 其中包含来自 Web 服务的字段 我正在考虑使用预 查找 挂钩获取数据 然后覆盖模式中 受众 属性的选项属性 Schema Compliance add title type Types Text
  • 永远运行 Gulp 脚本?

    是否可以运行 Gulp 脚本forever https www npmjs com package forever 我有 Gulp 脚本想要作为守护进程运行 所以我可以启动 停止 列出它 好的 所以我通过将 gulp 二进制文件从 usr
  • NodeJS:将 JSON 保存到 MongoDB

    我正在尝试从 API 获取 JSON 并将其存储到 MongoDB 数据库中 显然 这是行不通的 我的应用程序似乎停留在我尝试将数据保存到数据库的位置 请告知该怎么做 这是我的代码 var express require express v
  • 从同步上下文调用异步方法

    我在代码中通过 HTTP 调用服务 最终使用 HttpClient SendAsync 方法 然后从 WebAPI 控制器操作调用此代码 大多数情况下 它工作得很好 测试通过 但是当我在 IIS 上部署时 我遇到了死锁 因为异步方法调用的调
  • 如何在 Alexa 中循环播放音频

    我正在为 Alexa 构建睡眠环境音频技能 我正在尝试循环播放音频 这样我就不必下载 10 小时版本的音频 如何让音频正常工作 我将其构建到将播放音频但不循环播放的位置 我已经在我的造雨者技能中解决了这个问题 https www amazo
  • 从 Firestore 获取值并使用异步将输出存储为全局

    我正在尝试获取 firestore 数据 然后将其存储在变量中 async function getchildContent Parent Message let count 0 var db firebase firestore var
  • npm install 不起作用,抛出错误

    我正在尝试在 nodejs 中安装 yo 和其他一些软件包 但是我不断收到错误 我是节点新手 所以我有点迷失 我运行的是 Mac OS X 10 10 3 我正在使用的命令是 sudo npm install global yo 这样做会给
  • 没有导出的成员/节点模块

    我刚刚开始使用 5 分钟快速入门找到的 Angular 2 Typescripthere https angular io docs ts latest quickstart html 我遇到了一个看起来很常见的问题 但可能有点不同 我遇到
  • 如何在yarn中指定本地注册表?

    我有一个本地 Nexus 服务器 基本上我希望在上线之前先查看一下它prefer offline yarn install prefer offline cache folder C folder yarn cache preferred
  • Google API、drive.files.list 和仅返回子文件

    我正在使用 谷歌API https www npmjs com package googleapis NodeJS 中的库 我试图返回当前指定文件夹中的文件和文件夹列表 但我发现drive files list返回用户已被授予读取权限的所有
  • Nodejs Express 隐式中间件应用于所有路由?

    我想知道 Express 是否允许我创建一个默认调用的路由中间件 而无需我将其明确放置在 app get arg 列表中 NodeJS 新手 var data title blah So I want to include this in
  • NodeJs读取JSON文件

    我正在使用 NodeJs 读取 json 文件 我的代码非常基本 var obj require sample json console log obj 0 Sample json 文件包含这样的字符串化 JSON sample good
  • 变量前面加双下划线

    我的节点代码中有以下代码片段 var fs require fs fs readdir dirname function err files console log files 为什么变量 dirname 有双下划线 我知道一个下划线是私有
  • Node.js:server.setTimeout、server.timeout 和 server.keepAliveTimeout 之间有什么区别

    官方文档是here https nodejs org api http html http server settimeout msecs callback server setTimeout 中没有提及有关服务下一个请求的信息 所以我认为
  • Promise 构造函数回调的主体何时执行?

    假设我有以下代码构造一个Promise function doSomethingAsynchronous return new Promise resolve gt const result doSomeWork setTimeout gt
  • Morgan Logger + Express.js:写入文件并在控制台中显示

    我正在尝试将 Morgan 与 Express js 结合使用来编写日志文件 同时也在控制台上显示我的日志 我正在使用这段代码 var logger require morgan var accessLogStream fs createW

随机推荐

  • 从深度缓冲区读取深度值的有效方法

    对于我的算法 我需要能够访问深度缓冲区 我使用 glReadPixels 执行此操作完全没有问题 但读取 800x600 窗口的速度非常慢 从 300 fps 到 20 fps 我读了很多关于这方面的内容 我认为将深度缓冲区转储到纹理会更快
  • 在 Jenkins 上构建 Android Studio 项目? android.compileSdkVersion 丢失

    我正在尝试建立我的第一个 Android 项目来构建在 Jenkins 上 我正在运行 Jenkins 1 6 2 和 Gradle 插件版本 1 24 在 Windows 7 Professional SP1 上运行 我已经在我的构建机器
  • C# 中的 Base64 对象反序列化

    我有这样的课程 Serializable public class ExternalAccount public string Name get set 我已将其转换为 JSON 如下所示 Name XYZ 然后我对 JSON 字符串进行了
  • Dagger 生成改造拦截器的多个实例

    我是 Dagger 和 Retrofit 的新手 我遇到的问题是 尽管在 dagger 模块中声明了单例 但仍生成了多个改造自定义拦截器实例 我只需要一个实例 匕首模块 Module public class ApiModule priva
  • 如何根据内容调整 DIV 宽度

    我有一个带有附加样式的 div 元素 mypost border 1px solid Peru font family arial margin auto min width 700px width 700px 我正在 DIV 块内显示 W
  • Xamarin Forms:如何更改 Android 中的工具栏高度?

    我有一个使用 Toolbar 的 XF 应用程序 它已添加到我的 ContentPage 中 如下所示 public HomePage InitializeComponent var toolbarItem new ToolbarItem
  • 在 VB.NET 中使用模块是否被认为是不好的做法?

    在设计新应用程序期间 我想知道使用具有属性的模块是否被认为是一种不好的做法 一些示例代码 Module modSettings public property Setting1 as string public property Datab
  • Flask 应用程序在 Heroku 上失败:没有名为 app 的模块

    我有一个 Flask 应用程序已部署到 Heroku 但出现错误 2018 08 27T12 39 32 197715 00 00 heroku router at error code H10 desc App crashed metho
  • strtotime(PHP日期函数)的算法如何工作?

    我想知道怎么做斯特托时间 php 日期函数 工作吗 如何解析字符串像 2012 年 9 月 15 日 到时间戳 有没有更好的算法 我的目的是改变波斯语的这个功能 您可以浏览PHP的源代码 https github com php php s
  • 客户端-服务器代码应该写在一个还是两个“项目”中? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经开始开发客户端 服务器应用程序 起初 我自然地在 Eclipse 中创建了两个项目 两个源代码控制存储库等 但我很快发现两者之间有一些共享
  • iPhone SDK 4 中针对多个平台

    我有一个 iPhone SDK 项目 该项目应该为模拟器和 ARM 处理器构建一个静态库 然后将两者组合成一个通用库 到目前为止 我使用的是 iPhone SDK 3 并通过为每个模拟器和一个 ARM 创建一个单独的目标 然后使用 shel
  • $广播到当前范围

    作为前言 我有一个 Ionic 应用程序通过 websocket 连接到 Node 服务器 而 Node 服务器通过 TCP 套接字连接到 C 应用程序 我有这项服务连接并提供套接字服务 但也监视nack响应 以便它可以发出警报 通知用户错
  • 从 RGB 格式的文件加载位图(无 Alpha)

    我只想加载 BMP 文件并获取 24 位 RGB 格式 或 32 位 RGB 格式 的位图对象 我尝试的所有方法都返回 PixelFormat Format32bppArgb 的位图 图像对象 当然 即使 BMP 没有 alpha new
  • 如何通过 SSH 运行 php 脚本? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个相当长的 php 脚本 每当我的互联网连接中断一秒钟时 浏览器似乎就会停止该脚本 我不能等待 8 个小时来运行我的脚本 所以我想我可以通过 s
  • “dispatch()”是什么意思/做什么,为什么当我们有 .then() 和 .catch() 时使用它

    我是 ES6 和高级 javascript 新手 我见过使用 axios http 客户端的代码示例 如下所示 axios xxx then res gt dispatch success res err gt dispatch error
  • 哪个函数在堆栈使用效率和时间方面最好

    我编写了 3 个函数来计算元素在列表中出现的次数 我尝试了各种输入并对其进行了分析 但我仍然不知道哪个函数在堆栈使用效率和时间效率方面是最好的 请帮帮我 Using an accumulator defn count instances1
  • OpenCL - 将树复制到设备内存

    我用 C 代码实现了二叉搜索树 我的每个树节点如下所示 typedef struct treeNode int key struct treeNode right struct treeNode left treeNode t 宿主建造的树
  • NSCollectionView 取消多选

    所以我现在已经对这个主题进行了相当多的调查 但还没有发现任何与之相关的有用信息 我的问题是我创建了一个 NSCollectionView 它的作用类似于图像处理程序 因此您可以在其中放置图像 一次选择一个甚至多个图像 并根据需要删除它们 选
  • 如何在redshift中生成12位唯一编号?

    我的表中有 3 列 即email id rid final id 规则rid and final id If the email id有对应的rid use rid as the final id If the email id没有对应的r
  • for循环中多个异步函数之后的NodeJS回调

    我从 mongodb 获取一个文档 其中包含一个带有该文档注释的数组 评论中是撰写评论的用户的 id 我现在需要根据用户的 id 获取用户名 但遇到了几个问题 我有以下代码 显然 它不起作用 但我希望它能让您了解我想要完成的任务 MORE