我是nodejs和mongodb的新手,我正在尝试拼凑我自己的博客应用程序。我在尝试通过我的“博客”模型查询具有特定用户名的模型时遇到问题。当我尝试运行时
var userBlogs = function(username) {
ub = Blog.find({author: username}).toArray();
ub = ub.reverse();
};
我收到错误。
TypeError: Object #<Query> has no method 'toArray'
我知道全局变量很糟糕,但我一直试图让它发挥作用。 Mongo文档声称返回了一个游标,可以在其上调用toArray()方法。我不知道为什么它不起作用。这是我的架构/模型创建:
var blogSchema = mongoose.Schema({
title: {type:String, required: true},
author: String,
content: {type:String, required: true},
timestamp: String
});
var Blog = mongoose.model('Blog', blogSchema);
以下是/ login和/ readblog请求
app.get('/readblog', ensureAuthenticated, function(req, res) {
res.render('readblog', {user: req.user, blogs: ub})
})
app.get('/login', function(req, res){
res.render('login', { user: req.user, message: req.session.messages });
});
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login'}),
function(req, res) {
userBlogs(req.user.username);
res.redirect('/');
});
最终结果应该适用于这个Jade:
extends layout
block content
if blogs
for blog in blogs
h2= blog[title]
h4= blog[author]
p= blog[content]
h4= blog[timestamp]
a(href="/writeblog") Write a new blog
如何让查询输出数组,甚至作为对象?
答案 0 :(得分:6)
来自Native MongoDB NodeJS驱动程序(reference)的toArray
类中存在Cursor
函数。 MongooseJS中的find
方法返回Query
个对象(referenc e)。您可以通过多种方式进行搜索并返回结果。
由于MongoDB的NodeJS驱动程序中没有同步调用,因此在所有情况下都需要使用异步模式。 MongoDB的示例(通常使用MongoDB控制台的JavaScript)意味着本机驱动程序也支持类似的功能,但实际上并非如此。
var userBlogs = function(username, callback) {
Blog.find().where("author", username).
exec(function(err, blogs) {
// docs contains an array of MongooseJS Documents
// so you can return that...
// reverse does an in-place modification, so there's no reason
// to assign to something else ...
blogs.reverse();
callback(err, blogs);
});
};
然后,来称呼它:
userBlogs(req.user.username, function(err, blogs) {
if (err) {
/* panic! there was an error fetching the list of blogs */
return;
}
// do something with the blogs here ...
res.redirect('/');
});
您还可以对字段进行排序(例如博客发布日期):
Blog.find().where("author", username).
sort("-postDate").exec(/* your callback function */);
以上代码将根据名为postDate
的字段按降序排序(替代语法:sort({ postDate: -1})
。
答案 1 :(得分:0)
您应该使用find:
的回调var userBlogs = function(username, next) {
Blog.find({author: username}, function(err, blogs) {
if (err) {
...
} else {
next(blogs)
}
})
}
现在,您可以让您的博客调用此功能:
userBlogs(username, function(blogs) {
...
})
答案 2 :(得分:0)
尝试以下方面的内容:
Blog.find({}).lean().exec(function (err, blogs) {
// ... do something awesome...
}