在猫鼬模式子文档中使用 async/await [重复]

Posted

技术标签:

【中文标题】在猫鼬模式子文档中使用 async/await [重复]【英文标题】:using async/await in mongoose schema subdocument [duplicate] 【发布时间】:2019-04-25 19:37:10 【问题描述】:

我一直在尝试从 TransactionType Schema 中获取一个 ID 并将其用作新类别中的引用,但它总是在完成对新 TransactionType 的查询之前调用创建新类别。

const Category = require("../models/categories.model");
const TransactionType = require("../models/transactiontype.model");
async function saveNewCategory(req, res, next) 
    let transactionID;
    const transID = await TransactionType.findOne( name: req.body.transactionType )
        .populate("transactionType")
        .exec((error, res) => 
            console.log(res.id);
            transactionID = res.id;
            console.log(transactionID);
            return transactionID;
        );

    const newCategory = await new Category(
        name: req.body.name,
        transactionType: transactionID || transID ,
        image: req.body.image,
        description: req.body.description
    );
    try 
        await newCategory.save();
        await res
            .status(200)
            .send( response: "Response " + JSON.stringify(req.body, undefined, 2) );
     catch (error) 
        console.log(error);
    
;
module.exports = 
    saveNewCategory
;

它在完成 transID 之前创建未定义 transactionType 的 newCategory。 请在下面找到类别的架构。

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const category = new Schema(
    name: String,
    transactionType : 
        type: Schema.Types.ObjectId,
        ref: "TransactionType"
    ,
    image: String,
    description: String
);

const Category = mongoose.model('Category', category);
module.exports = Category;

在 TransactionType 模型下方查找

const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const transactionType = new Schema(
    transaction: String
);
const TransactionType = mongoose.model('TransactionType', transactionType);
module.exports = TransactionType;

如果有人能帮助我理解这一点,我将不胜感激。我浏览了许多书籍和博客来了解异步等待,但仍然没有答案。

【问题讨论】:

const transID = await TransactionType.findOne( name: req.body.transactionType ) .populate("transactionType") 这已经是一个承诺,你不需要exec() 和回调。也真的最好在里面试试。而new Category() 实际上并不是异步的,所以你不需要await 它。对第一种方法进行更改,删除 new Category() 上的 await,然后将所有代码移到其顶部的 try 块中。工作完成。 哇......它一针见血......谢谢@NeilLunn......完美的工作...... 【参考方案1】:

我认为您可以将所有异步内容放在立即异步函数中。这样saveNewCategory 不会在您的异步操作完成之前结束。

async function saveNewCategory(req, res, next) 
    (async () => 
      await asyncStuff()
    )()

编辑:为了更好地理解异步等待和承诺,请查看这篇文章: https://pouchdb.com/2015/03/05/taming-the-async-beast-with-es7.html

【讨论】:

以上是关于在猫鼬模式子文档中使用 async/await [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在猫鼬中获取子文档?

如何仅在猫鼬中获取子文档?

如何在猫鼬中保存子文档的数组?

在猫鼬中删除子文档

如何在猫鼬中找到最新的子文档

如何在猫鼬中填充另一个模型的子文档?