在猫鼬模式子文档中使用 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章