[英]How to make user registration with Node.js and MongoDB (using mongoose and Express.js)
[英]Can't include Review to the User Profile using Node js(express) and MongoDB(mongoose)
我在為用戶添加評論時遇到問題。 我為用戶創建評論后,它只顯示 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 %>" alt="User Profile Picture">
<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 %>
在這種情況下,評論僅顯示為 id,但在 mongo db.reviews.find() --> 一切正常: https ://gyazo.com/f1f476b87e554b689a36d07844ecc9b5
如果我在顯示頁面中放置類似 <%=review.author.username%> 的內容,它會顯示我的錯誤:
無法在 Array.forEach 處讀取未定義的屬性“用戶名”(編譯時的 eval (D:\\My projects\\Backend\\timeMe\\node_modules\\ejs\\lib\\ejs.js:618:12), :114:40) ) 在 eval (eval at compile (D:\\My projects\\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 [as引擎] (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:\\My projects\\Backend\\timeMe\\node_modules\\express\\lib\\application.js:640:10) 在 Function.render (D:\\My projects\\Backend\\timeMe\\node_modules\\ express\\lib\\application.js:592:3) 在 ServerResponse.render (D:\\My projects\\Backend\\timeMe\\node_modules\\express\\lib\\response.js:1008:7)
在 D:\\My projects\\Backend\\timeMe\\routes\\users.js:32:11 在 D:\\My projects\\Backend\\timeMe\\node_modules\\mongoose\\lib\\model.js:4465:16
at (匿名函數).call (D:\\My projects\\Backend\\timeMe\\node_modules\\mongoose\\lib\\query.js:3613:7)
在 process.nextTick (D:\\My projects\\Backend\\timeMe\\node_modules\\mongoose\\lib\\helpers\\query\\completeMany.js:35:39) at _combinedTickCallback (internal/process/next_tick.js:131:7) at process ._tickCallback (internal/process/next_tick.js:180:9)
感謝您的任何幫助。 真的一整天都在這段代碼中,無法理解這里有什么問題
您需要填充評論字段以在獲取用戶的同時獲取評論的所有數據。
//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});
}
})
問題出在用戶“show”路由中。 我只需要填充“評論”,但在用戶路由中://顯示用戶
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});
})
});
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.