簡體   English   中英

不能使用 Node js(express) 和 MongoDB(mongoose) 將評論包含到用戶配置文件中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM