Express. js с ошибкой приложения E JS: представление выдает ошибку "Cannot read property 'toString'" - PullRequest
0 голосов
/ 26 апреля 2020

Я работаю над приложением для ведения блога (нажмите на ссылку, чтобы увидеть репозиторий GitHub ) с Express, E JS и MongoDB.

У меня есть сообщений и Категории сообщений , каждая в своей коллекции.

Схема категорий:

const mongoose = require('mongoose');

const categorySchema = new mongoose.Schema({
    cat_name: {
        type: String,
        required: true
    },
    updated_at: {
        type: Date,
        default: Date.now()
    },
    created_at: {
        type: Date,
        default: Date.now()
    }
});

module.exports = mongoose.model('Category', categorySchema);

Схема сообщений:

const mongoose = require('mongoose');

const postSchema = new mongoose.Schema({
    title: {
        type: String,
        required: true
    },
    short_description: {
        type: String,
        required: true
    },
    full_text: {
        type: String,
        required: true
    },
    category: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'category'
    },
    post_image: {
        type: String,
        required: false
    },
    updated_at: {
        type: Date,
        default: Date.now()
    },
    created_at: {
        type: Date,
        default: Date.now()
    }
});

module.exports = mongoose.model('Post', postSchema);

Есть некоторые детали, которые я пропустил, потому что при обновлении сообщения, просмотре editpost.ejs возвращает ошибку Cannot read property 'toString' of undefined:

<form action="/dashboard/post/update/<%= post._id %>" method="POST" enctype="multipart/form-data" class="mb-0">
    <div class="form-group">
        <input type="text" class="form-control" name="title" value="<%= typeof form!='undefined' ? form.titleholder : post.title %>" placeholder="Title" />
    </div>

    <div class="form-group">
        <input type="text" class="form-control" name="excerpt" value="<%= typeof form!='undefined' ? form.excerptholder : post.short_description %>" placeholder="Excerpt" />
    </div>

    <div class="form-group">
        <textarea rows="5" class="form-control" name="body" placeholder="Full text">
            <%= typeof form!='undefined' ? form.bodyholder : post.full_text %>
        </textarea>
    </div>

    <% if (categories) { %>
        <div class="form-group">
            <label for="category">Choose a post category</label>
            <select id="category" name="category" class="form-control">
                <% categories.forEach(function(category, index) { %>
                    <option value="<%= category._id %>" <%=category._id.toString()==p ost.category._id.toString() ? 'selected' : ''; %>>
                        <%= category.cat_name %>
                    </option>
                    <% }); %>
            </select>
        </div>
        <% } %>

            <label for="postimage">Upload an image</label>
            <div class="form-group">
                <input type="file" name="postimage" id="postimage" size="20">
            </div>

            <div class="form-group d-flex mb-0">
                <div class="w-50 pr-1">
                    <input type="submit" value="Update Post" class="btn btn-block btn-md btn-success">
                </div>
                <div class="w-50 pl-1">
                    <a href="/dashboard" class="btn btn-block btn-md btn-success">Cancel</a>
                </div>
            </div>
</form>

В контроллере метод updatePost выглядит следующим образом:

exports.updatePost = (req, res, next) => {

    const query = {
        _id: req.params.id
    }

    const form = {
        titleholder: req.body.title,
        excerptholder: req.body.excerpt,
        bodyholder: req.body.body
    };

    const errors = validationResult(req);

    const post = {};

    post._id = req.params.id;
    post.title = req.body.title;
    post.short_description = req.body.excerpt
    post.full_text = req.body.body;
    post.category = req.body.category;
    if (req.file) {
        post.post_image = req.file.filename;
    }

    if (!errors.isEmpty()) {
        req.flash('danger', errors.array());
        const categories = Category.find({}, (err, categories) => {
            res.render('admin/editpost', {
                layout: 'admin/layout',
                website_name: 'MEAN Blog',
                page_heading: 'Dashboard',
                page_subheading: 'Edit Post',
                categories: categories,
                form: form,
                post: post
            });
        });
    } else {
        Post.update(query, post, function(err) {
            if (err) {
                console.log(err);
                return;
            } else {
                req.flash('success', "The post was successfully updated");
                req.session.save(() => res.redirect('/dashboard'));
            }
        });
    }
}

Что я пропустил?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Я думаю, что ваша проблема здесь заключается в следующем: post.category._id.toString() Когда вы передаете категорию в req.body, вы передаете category._id в качестве этого параметра, поэтому, когда вы создаете этот объект post в вашем контроллере, вы устанавливаете post.category как req.body.category, когда вы возвращаете это в представление post.category не является объектом со свойством ._id и метод toString() для него не существует. Попробуйте использовать post.category вместо

1 голос
/ 26 апреля 2020

Ничего не делайте, но сначала обработайте req.file в маршруте сообщения, потому что вы используете enctype="multipart/form-data". Используйте req.file где-нибудь, и это будет работать нормально! Я не знаю точную причину, но это работает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...