不能使用 Node js(express) 和 MongoDB(mongoose) 对用户配置文件进行审核
Posted
技术标签:
【中文标题】不能使用 Node js(express) 和 MongoDB(mongoose) 对用户配置文件进行审核【英文标题】:Can't include Review to the User Profile using Node js(express) and MongoDB(mongoose) 【发布时间】:2019-01-24 13:59:18 【问题描述】:我在为用户添加评论时遇到问题。一旦我为用户创建评论,它只显示 id,而不显示文本或作者或任何其他属性。很高兴听到任何想法。
这是我的架构和路线:
1) 用户模式:
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 = require("mongoose");
var reviewSchema = new mongoose.Schema(
text: String,
author:
id:
type: mongoose.Schema.Types.ObjectId,
ref: "User"
,
username: String
,
created: type: Date, default: Date.now
);
module.exports = mongoose.model("Review", reviewSchema);
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)显示页面
<% include ../partials/header %>
<div class="card">
<ul class="list-group list-group-flush">
<li class="list-group-item heading-user"><%=user.firstName%> <%=user.lastName%></li>
</ul>
</div>
<div class="row">
<div class="col-md-4">
<img class="img-thumbnail" src="<%= user.avatar %>" >
<div class="card">
<ul class="list-group list-group-flush">
<li class="list-group-item">Profession: <%=user.job%></li>
<li class="list-group-item">Experience: <%=user.experience%> years</li>
<li class="list-group-item">Birth Date: <%=user.yearOfBirth%></li>
<li class="list-group-item">Location: <%=user.country%>, <%=user.city%></li>
<li class="list-group-item"><%=user.firstName%> has <i class="fas fa-clock"></i> 12 hours on account</li>
</ul>
<a href="#" class="btn btn-success">Connect <%=user.firstName%></a>
</div>
</div>
<div class="col-md-8">
<div class="card">
<ul class="list-group list-group-flush">
<li class="list-group-item">
<p>About <%=user.firstName%>: </p>
<p><%= user.description %></p>
</li>
<li class="list-group-item">Some posts of <%= user.firstName %>:
<ul>
<% posts.forEach(function(post) %>
<li><a href="/posts/<%= post._id %>"><%= post.title %></a></li>
<% ); %>
</ul>
</li>
</ul>
</div>
<div class="card bg-light comments">
<div class="card-block">
<a href="/users/<%=user._id%>/reviews/new" class="btn btn-inline btn-outline-secondary">What do you think about <%=user.firstName%></a>
</div>
<hr>
<% user.reviews.forEach(function(review) %>
<p><%= review %></p>
<% ); %>
</div>
</div>
</div>
<% include ../partials/footer %>
在这种情况下,review 仅显示为 id,但在 mongo db.reviews.find() 中 -> 一切正常: https://gyazo.com/f1f476b87e554b689a36d07844ecc9b5
如果我在显示页面中放置类似 的内容,则会显示错误:
无法读取 eval 处未定义的属性“用户名”(eval at 编译(D:\我的 项目\Backend\timeMe\node_modules\ejs\lib\ejs.js:618:12), :114:40) 在 Array.forEach () 在 eval (eval 编译时(D:\My 项目\Backend\timeMe\node_modules\ejs\lib\ejs.js:618:12), :111:21) 在返回Fn (D:\My projects\Backend\timeMe\node_modules\ejs\lib\ejs.js:653:17)在 tryHandleCache (D:\My projects\Backend\timeMe\node_modules\ejs\lib\ejs.js:251:36)在 View.exports.renderFile [作为引擎] (D:\My projects\Backend\timeMe\node_modules\ejs\lib\ejs.js:482:10)在 View.render (D:\My projects\Backend\timeMe\node_modules\express\lib\view.js:135:8) 在 tryRender (D:\我的 项目\Backend\timeMe\node_modules\express\lib\application.js:640:10) 在 Function.render (D:\My 项目\Backend\timeMe\node_modules\express\lib\application.js:592:3) 在 ServerResponse.render (D:\My 项目\Backend\timeMe\node_modules\express\lib\response.js:1008:7) 在 D:\My projects\Backend\timeMe\routes\users.js:32:11 在 D:\My 项目\Backend\timeMe\node_modules\mongoose\lib\model.js:4465:16 在 (匿名函数).call (D:\My 项目\Backend\timeMe\node_modules\mongoose\lib\query.js:3613:7) 在 process.nextTick (D:\My 项目\Backend\timeMe\node_modules\mongoose\lib\helpers\query\completeMany.js:35:39) 在 _combinedTickCallback (internal/process/next_tick.js:131:7) 在 process._tickCallback (internal/process/next_tick.js:180:9)
感谢您的帮助。真的整天都在这段代码里,看不懂这里有什么问题
【问题讨论】:
你的用户架构和评论架构都一样???我想你忘了复制审查模式??? 当然不是 :) 感谢您指出错字 没问题:)查看答案,需要使用populate获取引用数据。 【参考方案1】:在获取用户的同时,您需要填充评论字段以获取评论的所有数据。
//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);
)
【讨论】:
非常感谢您的评论,但错误仍然相同:( gyazo.com/cd3e845a3e0262aabc8f251399486ea1 同样只是用于审核的 ID,如果我尝试执行类似 我收到错误:无法读取未定义的属性“用户名” 评论模式中的作者用户名是否与用户模式中的用户名冗余?我认为您应该像这样引用用户:作者:type:mongoose.Schema.ObjectId,ref:'User' 然后确保按照上面的说明填充评论并使用review.author.username 引用该字段 迈克尔,你是对的。它实际上并没有太多改变代码,而是让它更清晰。我填充评论,但仍然犯了同样的错误。我重写了这段代码一百万次,仍然不知道这里有什么问题......【参考方案2】:问题出在用户“显示”路径中。 我只需要填充“评论”,但在用户路线中: //显示用户
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);
)
);
);
【讨论】:
以上是关于不能使用 Node js(express) 和 MongoDB(mongoose) 对用户配置文件进行审核的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB 或 PostGreSQL 使用 Python Django 和 Express 和 Node js 会更好 [关闭]