不能使用 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) 对用户配置文件进行审核的主要内容,如果未能解决你的问题,请参考以下文章

Jade 模板布局不能与 Node.js 结合使用

使用 Express 限制对 Node.js 的访问

MongoDB 或 PostGreSQL 使用 Python Django 和 Express 和 Node js 会更好 [关闭]

Node.js 和 Express 排除路由表单 JWT 中间件

Node.js和Express排除路由形式JWT中间件

使用 Node.js 和 Express 发布时如何访问请求正文?