为什么地图功能没有完成它的执行

Why is map function doesn't finish it's execution

你好,我正在用 node js 构建一个服务器,作为我项目的一部分,我使用 MongoDB 和 mongoose 中间件,我有一个名为 blogSchema 的模式。我想获取数据库中所有博客的列表,然后为每个博客添加一个名为 authorized 的元素,告诉用户天气他有权查看此博客。 这是请求

let Blogs = require('../model/index')('Blogs'); // here is the db

router.get('/list',async function (req,res) {
    let blogList = await Blogs.REQUEST();
    let temp = await blogList.map(async function (blog) {
       blog.authorized = await Blogs.IsUserInBlog(req.user.email, blog.name);
       console.log(blog);
       return blog;
    });

    res.json(blogList);
}); 

这里是架构的功能

blogSchema.statics.IsUserInBlog = async function(user,blogname) {
    let isUser = await this.findOne( { name:blogname, users: { $in : [user]} }).count();
    return isUser != 0;
};

blogSchema.statics.REQUEST = async function(cb) {
        let u = await this.find({});
        return u;
    };

然而,每次当我到达函数 IsUserInBlog 时尝试请求此列表,代码都会被抛到 router.post 方法的末尾(到行 res.json(blogList)并且博客列表不会更改其 authorized 值。 这是因为异步吗?我该如何解决?

当你在blogList上映射时,你创建了一个异步映射函数,这没问题。

Map 函数迭代数组中的每个元素,最后 return 一个数组。

我认为解决方案应该是 return temp 而不是 blogList。

所以代替这一行:

res.json(blogList);

你应该写:

res.json(temp);

编辑:

您应该使用 Promise.map 如下:

router.get('/list',async function (req,res) {
    let blogList = await Blogs.REQUEST();
    let temp = await Promise.map(blogList, async function (blog) {
        blog.authorized = await Blogs.IsUserInBlog(req.user.email, blog.name);
        console.log(blog);
        return blog;
    });

    res.json(temp);
});