我是一个(相对缺乏经验的)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);
});
});
这对我不起作用,因为我也会从图像,评论和用户集合中获取信息。有异步方法吗?如果没有,有没有办法重新配置我所拥有的,以便它可以是异步的? (我试图了解异步编程。)
提前致谢!
答案 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