Mongoose / Ejs - я не вижу комментарий, который я сделал, если я снова получаю сообщение, только после того, как я сделал его, когда он виден - PullRequest
0 голосов
/ 01 июля 2019

Таким образом, в основном я не вижу комментарий, который я сделал, только после того, как я создал комментарий и когда я снова отображаю ту же страницу, я вижу комментарий и его автора, но я не вижу его, если я,например, перейдите на страницу постов или myposts, а затем я ПОЛУЧУ тот же пост, где я создал комментарий, тогда комментарий уже не будет виден.Пожалуйста, помогите мне, я не знаю, почему комментарий больше не виден, если я попытаюсь снова получить тот же пост после того, как покинул эту страницу.

Если у вас есть какие-либо идеи для меня, как я должен создать исделайте мой комментарий модель, пожалуйста, помогите мне:)

model.js

const mongoose = require("mongoose"),
    Schema = mongoose.Schema,
    bcrypt = require("bcryptjs");


const commentSchema = new Schema({
    context: String,
    author: String,
    postId: {
        type: Schema.Types.ObjectId
    }
})


const postSchema = new Schema({
    title: String,
    description: String,
    context: String,
    author: {
        type: Schema.Types.ObjectId,
    },
    comments: [commentSchema]
});


const userSchema = new Schema({
    name: {
        type: String,
        required: true
    },

    email: {
        type: String,
        required: true,
    },

    password: {
        type: String,
        required: true
    },

    posts: [postSchema]
});




userSchema.pre("save", async function save(next) {
    const user = this;
    if (!user.isModified("password")) return next();
    const hashedPassword = await bcrypt.hash(user.password, 10);
    user.password = hashedPassword;
    next();
});


const Post = mongoose.model("Post", postSchema);
const User = mongoose.model("User", userSchema);
const Comment = mongoose.model("Comment", commentSchema)

module.exports = {
    User,
    Post,
    Comment
}

контроллер администратора

exports.postCreateComment = async (req, res) => {
    const {
        context
    } = req.body;
    try {
        const post = await Post.findById(req.params.postId);

        const comment = new Comment({
            context: context,
            author: req.user.name,
            postId: post._id
        });

        const savedComment = await comment.save();
        const postsComment = await post.comments.push(comment);

        res.render("admin/post", {
            path: "/posts",
            pageTitle: post.title,
            post: post,
        });
    } catch (error) {
        console.log(error);
    }

}

маршрут администратора

router.post("/posts/:postId", adminController.postCreateComment);

    <main class="post-detail">
        <h1><%= post.title %></h1>
        <h2><%= post.description%></h2>
        <p><%= post.context%></p>
        <% if(String(post.author) === String(user._id)) { %>
        <a href="/posts/edit-post/<%= post._id %>">Edit Post</a>
        <a href="/posts/deleted-post/<%= post._id %>">Delete Post</a>
        <% } %>
    </main>
    <div class="create-comment">
        <form action="/posts/<%=post._id%>" method="POST">
            <label for="comment">Comment Here</label>
            <textarea name="context" placeholder="Enter Comment..." cols="30" rows="10"></textarea>
            <input type="hidden" name="_csrf" value="<%= csrfToken %>">
            <button type="submit">Submit</button>
        </form>
    </div>
    <% if (post.comments.length > 0) { %>
    <% for (let comment of post.comments) { %>

    <div class="comment">
        <div>
            <article>
                <h1><%=comment.author%></h1>
                <p><%=comment.context%></p>
            </article>
        </div>
    </div>

    <% } %>
    <% } %>

1 Ответ

0 голосов
/ 03 июля 2019

Вместо того, чтобы находить сообщение, создавать комментарий и затем изменять его, было бы гораздо разумнее создать комментарий и затем найти сообщение. Если комментарий был успешно создан, он будет отображаться, а если нет, то будет более ясно, где была ошибка (подозреваю, что есть проблема с логикой comment.save())

        const comment = new Comment({
            context: context,
            author: req.user.name,
            postId: req.params.postId
        });
        const savedComment = await comment.save();
        const post = await Post.findById(req.params.postId);
        // note that this no longer needs `post.comments.push` so it's no longer mutating the returned post
        res.render("admin/post", {
            path: "/posts",
            pageTitle: post.title,
            post: post,
        });
...