Node.js: сообщение об успехе и ошибке не отображается - PullRequest
1 голос
/ 27 октября 2019

Я хочу показать сообщение об успехе в моем отдельном сообщении. Я использую connect-flash, express-session , чтобы показать флэш-сообщение.

Пытался также перенести сообщение на другую страницу. Но сообщение не кастинг. Таким образом, он не отображается ни на одной странице. Я следую scotch , чтобы отобразить сообщение об успешном завершении.

Когда я пытаюсь отправить пустую форму, в консоли отображается следующая ошибка MongoError: E11000 duplicate key error collection

. :

const eventSchema = new Schema({
    name: {
        type: String,
        require: [true, 'Event name is required']
    },
    slug: {
      type: String,
      unique: true,
      sparse: true
    },
    description: {
        type: String,
        require: [true, 'Event description is required']
    },
}, {collection: 'event'});

const eventModel = mongoose.model('Event', eventSchema);

app.js:

const session = require('express-session'),
    flash     = require('connect-flash');

app.use(session({
    secret: 'secret-key',
    cookie: {
        secure: true,
        maxAge: 60000,
    },
    resave: false,
    saveUninitialized: false
}));

app.use(flash());app.use(session({
    secret: 'secret-key',
    cookie: {
        secure: true,
        maxAge: 60000,
    },
    resave: false,
    saveUninitialized: false
}));
app.use(flash());

контроллер:

const Event = require('../models/event'),
{ body, validationResult } = require('express-validator');

exports.showSingleEvent = async(req, res) => {
    try {
        await Event.findOne({ slug: req.params.slug }).exec((error, event) => {
            if(error) {
                res.status(404);
                res.send('Events not found');
            }

            res.render('pages/single', {
                title: `Event: ${event.name}`,
                event: event,
                success: req.flash('success')
            });
        });   
    } catch (error) {
        return next(error);
    }
};

exports.createEvent = ([
    // Validate data
    body('name')
        .isLength({ min: 5, max: 30 })
        .not().isEmpty()
        .trim()
        .escape(),
    body('description')
        .isLength({ min: 5, max: 200 }).withMessage('Must be between 5 & 200')
        .not().isEmpty()
        .trim()
        .escape()
], async(req, res) => {
    // Check if has errors
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.array() });
      } else {
        const event = new Event({
            name: req.body.name,
            description: req.body.description
        });

        await event.save((error) => {
            if(error) throw error;

            // Flash successful message
            req.flash('success', 'Data has created successfully!');

            // Redirect to newly created event
            res.redirect(`/events/${event.slug}`);
        });
    }
});

single.ejs:

<% if (success.length > 0) { %>
    <div class="alert alert-success mt-2 mb-2">
        <%= success %>
    </div>
<% } %>

<div class="jumbotron text-center">
    <h1><%= event.name %></h1>
    <p><%= event.description %></p>
    <p>
        <a href="/events" class="btn btn-success">All events</a>
    </p>
</div>

create.ejs:

       <% if (errors.length > 0) { %>
            <div class="alert alert-success mt-2 mb-2">
                <% for (error of errors ) { %>
                    <%= error %> <br>
                <% } %>
            </div>
        <% } %> 

        <form action="/events/create" method="POST">

            <div class="form-group">
                <label>Name</label>
                <input type="text" name="name" class="form-control">
            </div>

            <div class="form-group">
                <label>Description</label>
                <textarea name="description" rows="5" class="form-control"></textarea>
            </div>

            <div class="form-group">
                <button type="submit" class="btn btn-success btn-lg">Create</button>
            </div>

        </form>
...