为什么地图功能无法完成其执行

时间:2018-08-19 13:24:21

标签: node.js mongoose map-function

嗨,我正在用节点js构建服务器,作为我项目的一部分,我将MongoDB与mongoose中间件一起使用,我有一个名为blogSchema的架构。我想获取数据库中所有博客的列表,然后在foreach博客中添加一个名为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的值。 是因为异步吗?我该怎么解决?

1 个答案:

答案 0 :(得分:0)

当您在blogList上进行映射时,您创建了一个异步映射函数,可以。

Map函数对数组中的每个元素进行迭代,最后返回一个数组。

我认为解决方案应该是返回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);
});