node.js - 在一个 View 上显示不同 Mongoose 表的内容

标签 node.js mongodb asynchronous express mongoose

我是一名(相对缺乏经验的)Java EE 开发人员,正在学习 Node.js。我正在使用express框架、mongodb和mongoose框架。我一直致力于使用类似 mvc 的架构构建一个简单的博客网站(仅供练习)。它将有 4 个 mongodb 集合:帖子、图像、用户、评论。基本Schema如下:

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);
    });
});

这对我来说不起作用,因为我还会从图像、评论和用户集合中获取信息。有异步方法可以做到这一点吗?如果没有,有没有办法重新配置我所拥有的,以便它可以是异步的? (我正在尝试感受异步编程。)

提前致谢!

最佳答案

按原样执行此操作的简单方法是使用 Promise 并执行同步异步操作:

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 模板中,您将拥有一个具有四个属性的对象。

您可以在没有 promise 的情况下执行同时异步操作,但我将把它留给其他人来讨论。我更喜欢有 promise 地工作。

<小时/>

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

关于node.js - 在一个 View 上显示不同 Mongoose 表的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33426367/

相关文章:

node.js - 使用带有 Web Matrix 2 新 Node 支持的 Meteor?

javascript - 子进程生成返回 NaN

javascript - React-Native 上的 this.on 事件发射器不是一个函数

node.js - 通过 URL POST 到 mongodb

ruby-on-rails - 如何使用延迟作业在 Rails 中执行异步任务?

android - 'Future<dynamic >' has no instance getter ' body' 错误,当试图在 Flutter 中访问 Future SmsMessage 变量的主体时

javascript - 来自异步调用示例的返回响应

javascript - grunt.js 配置中常用配置选项的继承

javascript - 如何将下拉值传递给模板助手。 [ meteor +火焰]

node.js - 如何更新 sails mongodb 中的特定字段