在一个视图上显示来自不同mongoose表的内容

时间:2015-10-29 23:23:22

标签: node.js mongodb asynchronous express mongoose

我是一个(相对缺乏经验的)Java EE开发人员,他正在学习node.js.我正在使用express框架,mongodb和mongoose框架。我一直致力于建立一个简单的博客网站(仅用于练习),使用类似mvc的架构。它将拥有4个mongodb集合:post,image,user,comment。基本架构如下:

postSchema = mongoose.Schema({
    id: Number,
    dateCreated, {type: Date, default: Date.now}
    title: String,
    content: String
});
var Post = mongoose.model('Post', postSchema);

imageSchema = mongoose.Schema({
    id: Number, 
    postId: Number,
    path: String
});

var Image = mongoose.model('Image', imageSchema);

userSchema = mongoose.Schema({
    id: Number, 
    username: String,
    password: String,
    email: String
});

var User = mongoose.model('User', userSchema);

commentSchema = mongoose.Schema({
    id: Number,
    postId: Number,
    userId: Number, 
    dateCreated: {type: Date, default: Date.now},
    content: String
});

var Comment = mongoose.model('Comment', commentSchema);

我希望能够在一个页面上显示帖子,图片,评论和用户信息。我的问题是我无法弄清楚如何以异步方式检索和发送所有这些数据。这似乎是我发现的大多数例子(不一定都在一个文件中):

app.get('/', function(res, req) {
    Post.findOne(function(err, post) {
         if (err) return res.send(500);
         res.render('index', post);
    });
});

这对我不起作用,因为我也会从图像,评论和用户集合中获取信息。有异步方法吗?如果没有,有没有办法重新配置我所拥有的,以便它可以是异步的? (我试图了解异步编程。)

提前致谢!

1 个答案:

答案 0 :(得分:0)

简单的方法就是使用promises并执行同步异步操作:

Post.findOne(id).then(post => {
    let postId = post.id;
    return Promise.all([
        Comments.find({postId}),
        Images.find({postId}),
        // Not sure what query you need here
        User.find(),
        post,
    ]);
}).then(data => {
    let [comments, images, users, post] = data;
    res.render('index', {comments, images, users, post});
});

index模板中,您将拥有一个包含四个属性的对象。

您可以在没有承诺的情况下同时执行异步操作,但我会将其留给别人讨论。我更愿意与承诺合作。

Mongoose还允许您将其他模式定义用作数据类型,如:

commentSchema = mongoose.Schema({
    id: Number,
    postId: Post,
    userId: User, 
    dateCreated: {type: Date, default: Date.now},
    content: String
});

在这种情况下,您可以在某些查询后使用.populate,以便在幕后执行其他查询 - 例如获取评论的帖子数据。

由于您使用的是MongoDB - 一个NoSQL数据库 - 我会考虑对数据进行非规范化并使其保持平稳。 Firebase, which stores data in a similar structure has a great article on how to store and use denormalized data