使用 mongodb 请求的 Promise 改进代码

Improve code with a Promise for a mongodb request

我是 javascript(和编码)的新手,我正在研究 Promises。

我有以下工作代码:

router.get("/test", function(req, res){

    var mainCategory = new Promise(function(resolve, reject){
        Maincategory.find().populate("subcategory").exec(function(err, allMaincategories){
            if (err) {
                console.log("error 1");
                reject("error 2");
            }
            else {
                resolve(allMaincategories);
            }
        });
    });

    var itemQuery = new Promise(function(resolve, reject){
        Items.find({}, function(err, allItems){
            if (err) {
                console.log("error 3");
                reject("error 4");}
            else {
            resolve(allItems);
            reject("error 5");
            }
        });
    });

    Promise.all([
        mainCategory,
        itemQuery
    ]).then(function(allQueries){
        console.log(allQueries);
        var allCategories = allQueries[0];
        var allItems = allQueries[1]
        var userId = "true";
        var show = "list";
        res.render("test.ejs", {
            allCategories: allCategories, 
            allItems: allItems,
            userId: userId,
            show: show
        });
    }).catch(function(error){
        console.log("error 6");
        res.render("error.ejs", {error: error});
    });
});

问题 1:在这样的 promise 中使用回调是否正确?

问题 2:是否有一种(更短的)方式将所有 mongoose 请求放在一个 promise 中?

Mongoose 已经查询 return Promises - 因为您正在使用 Promises,所以最好 使用 Promise 它 returns 而不是构造一个与回调一起使用的新一个:

Promise.all([
  Maincategory.find().populate("subcategory").exec(),
  Items.find({})
]).then(function(allQueries){
  // ...

mongoose 本身已经支持 promises,因此根本没有理由像您正在做的那样创建 promise。这个:

var mainCategory = new Promise(function(resolve, reject){
    Maincategory.find().populate("subcategory").exec(function(err, allMaincategories){
        if (err) {
            console.log("error 1");
            reject("error 2");
        }
        else {
            resolve(allMaincategories);
        }
    });
});

应替换为

const subcatPromise = Maincategory.find().populate("subcategory").exec();

var itemQuery = new Promise(function(resolve, reject){
    Items.find({}, function(err, allItems){
        if (err) {
            console.log("error 3");
            reject("error 4");}
        else {
        resolve(allItems);
        reject("error 5");
        }
    });
});

等同于

const itemsPromise = Items.find({});
router.get("/test", async function (req, res) {
    try {
        const allQueries = await Promise.all([Maincategory.find().populate("subcategory").exec(), Items.find({}).exec()]),
            allCategories = allQueries[0],
            allItems = allQueries[1],
            userId = "true",
            show = "list";
        res.render("test.ejs", {
            allCategories: allCategories,
            allItems: allItems,
            userId: userId,
            show: show
        });
    } catch (error) {
        console.log("error 6");
        res.render("error.ejs", {
            error: error
        });
    };
});