为什么地图功能没有完成它的执行
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);
});
你好,我正在用 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);
});