嗨,我正在用节点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
的值。
是因为异步吗?我该怎么解决?
答案 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);
});