Javascript Can';t包括使用Node js(express)和MongoDB(mongoose)查看用户配置文件
我有一个问题,包括审查的用户。为用户创建评论后,它只显示id,而不显示文本、作者或任何其他属性。我很乐意听到任何想法 以下是我的模式和路线: 1) 用户架构:Javascript Can';t包括使用Node js(express)和MongoDB(mongoose)查看用户配置文件,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我有一个问题,包括审查的用户。为用户创建评论后,它只显示id,而不显示文本、作者或任何其他属性。我很乐意听到任何想法 以下是我的模式和路线: 1) 用户架构: var mongoose = require("mongoose"); var passportLocalMongoose = require("passport-local-mongoose"); //SCHEMA SETTING UP var UserSchema = new mongoose.Schema({ use
var mongoose = require("mongoose");
var passportLocalMongoose = require("passport-local-mongoose");
//SCHEMA SETTING UP
var UserSchema = new mongoose.Schema({
username: String,
password: String,
isAdmin: {type: Boolean, default: false},
firstName: String,
lastName: String,
email: String,
avatar: String,
yearOfBirth: Number,
job: String,
experience: Number,
city: String,
country: String,
description: String,
reviews: [
{
type: mongoose.Schema.Types.ObjectId,
ref: "Review"
}
]
});
UserSchema.plugin(passportLocalMongoose);
module.exports = mongoose.model("User", UserSchema);
2) 复习模式
var mongoose=要求(“mongoose”)
3) 复习路线
var express = require("express");
var router = express.Router({mergeParams: true});
var Post = require("../models/post");
var Comment = require("../models/comment");
var User = require("../models/user");
var Review = require("../models/review");
var middleware = require("../middleware");
//Review New
router.get("/new", middleware.isLoggedIn, function(req, res){
// find campground by id
console.log(req.params.id);
User.findById(req.params.id).populate("reviews").exec(function (err, user) {
if(err){
console.log(err);
} else {
res.render("reviews/new", {user: user});
}
});
});
//Review Create
router.post("/", middleware.isLoggedIn,function(req, res){
//lookup user using ID
User.findById(req.params.id).populate("reviews").exec(function (err, user) {
if(err){
console.log(err);
res.redirect("/users");
} else {
Review.create(req.body.review, function(err, review){
if(err){
req.flash("error", "Something went wrong :(");
console.log(err);
} else {
//add username and id to comment
review.author.id = req.user._id;
review.author.username = req.user.username;
//save comment
review.save();
user.reviews.push(review);
user.save();
console.log(review);
req.flash("success", "Successfully added review!");
res.redirect('/users/' + user._id);
}
});
}
});
});
module.exports = router;
4) 显示页面
“alt=”用户配置文件图片“>
职业:
- 经验:年
出生日期:
- 位置:
- 有12个小时的备用时间
-
关于:
- 以下部分帖子:
在本例中,review仅显示为id,但在mongo db.reviews.find()-->all ok:
如果我在“显示”页面中放置类似的内容,则会显示我的错误:
无法读取eval时未定义的属性“username”(eval在
编译(D:\My)
projects\Backend\timeMe\node\u modules\ejs\lib\ejs.js:618:12),
:114:40)at Array.forEach()at eval(eval
在编译时(D:\My)
projects\Backend\timeMe\node\u modules\ejs\lib\ejs.js:618:12),
:111:21)返回时fn(D:\我的
projects\Backend\timeMe\node_modules\ejs\lib\ejs.js:653:17)位于
tryHandleCache(D:\My
projects\Backend\timeMe\node\u modules\ejs\lib\ejs.js:251:36)位于
View.exports.renderFile[作为引擎](D:\My
projects\Backend\timeMe\node\u modules\ejs\lib\ejs.js:482:10)位于
View.render(D:\My
projects\Backend\timeMe\node\u modules\express\lib\view.js:135:8)位于
tryRender(D:\My
projects\Backend\timeMe\node\u modules\express\lib\application.js:640:10)
在Function.render(D:\My
projects\Backend\timeMe\node\u modules\express\lib\application.js:592:3)
在ServerResponse.render(D:\My
projects\Backend\timeMe\node\u modules\express\lib\response.js:1008:7)在D:\My projects\Backend\timeMe\routes\users.js:32:11在D:\My projects\Backend\timeMe\node\u modules\mongoose\lib\model.js:4465:16
at(匿名函数)。调用(D:\My projects\Backend\timeMe\node\u modules\mongoose\lib\query.js:3613:7)
在process.nextTick(D:\My projects\Backend\timeMe\node\u modules\mongoose\lib\helpers\query\completeMany.js:35:39) at _combinedTickCallback(内部/流程/下一步_tick.js:131:7)at 进程。_tick回调(内部/process/next_tick.js:180:9)
感谢您的帮助。在这段代码中,真的花了一整天的时间,无法理解这里出了什么问题您需要填充reviews字段,以便在获取用户信息时获取所有评论数据
//Review New
router.get("/new", middleware.isLoggedIn, function(req, res){
// find campground by id
console.log(req.params.id);
User.findById(req.params.id).populate('reviews').exec( function(err, user)
{
if(err){
console.log(err);
} else {
res.render("reviews/new", {user: user});
}
})
问题出现在用户“显示”路径中。
我只需要填充“评论”,但在用户路径中:
//显示用户
router.get("/:id", function(req, res) {
User.findById(req.params.id).populate("reviews").exec(function(err, foundUser) {
if(err) {
req.flash("error", "Something went wrong.");
return res.redirect("/");
}
console.log(foundUser);
Post.find().where('author.id').equals(foundUser._id).exec(function(err, posts) {
if(err) {
req.flash("error", "Something went wrong.");
return res.redirect("/");
}
res.render("users/show", {user: foundUser, posts: posts});
})
});
});
您的用户模式和审阅模式都是相同的???我想您忘了复制审阅模式???当然不是:)感谢您指出键入错误没有问题:)检查答案,您需要使用“填充”来获取引用的数据。非常感谢您的评论,但错误仍然相同:(审查时使用相同的ID,如果我尝试执行类似于的操作,我会遇到错误:无法读取未定义的属性'username',审查模式中的作者用户名与用户模式中的用户名冗余?我认为您应该像这样引用用户:作者:{type:mongoose.Schema.ObjectId,ref:'User'}然后一定要像上面所说的那样填充评论,并用review.author.usernameMael引用该字段。你是对的。它确实不会对代码做太多更改,但会让它更清楚。我填充评论,但仍然犯了同样的错误。我重写了一百万次代码,仍然不知道这里有什么问题。。。
//Review New
router.get("/new", middleware.isLoggedIn, function(req, res){
// find campground by id
console.log(req.params.id);
User.findById(req.params.id).populate('reviews').exec( function(err, user)
{
if(err){
console.log(err);
} else {
res.render("reviews/new", {user: user});
}
})
router.get("/:id", function(req, res) {
User.findById(req.params.id).populate("reviews").exec(function(err, foundUser) {
if(err) {
req.flash("error", "Something went wrong.");
return res.redirect("/");
}
console.log(foundUser);
Post.find().where('author.id').equals(foundUser._id).exec(function(err, posts) {
if(err) {
req.flash("error", "Something went wrong.");
return res.redirect("/");
}
res.render("users/show", {user: foundUser, posts: posts});
})
});
});