Express. js ошибка приложения: метод validationResult (req) не работает - PullRequest
1 голос
/ 05 марта 2020

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

Перед отправкой нового сообщения, конечно, я должен проверить записи формы . Я использую express -validator версия 6.3.0.

Мой контроллер addPost:

exports.addPost = (req, res, next) => {
    // Form validation rules
    check('title', 'The title field id required')
        .not()
        .isEmpty();
    check('excerpt', 'The excerpt field id required')
        .not()
        .isEmpty();
    check('body', 'The full text field id required')
        .not()
        .isEmpty();

    const errors = validationResult(req);

    if (!errors.isEmpty()) {
        console.log(errors.array());
    }

    if (!errors.isEmpty()) {
        res.render('admin/addpost', {
            layout: 'admin/layout',
            website_name: 'MEAN Blog',
            page_heading: 'Dashboard',
            page_subheading: 'Add New Post',
            errors: errors
        });
        req.flash('danger', errors);
        req.session.save(() => res.redirect('/dashboard'));
    } else {
        const post = new Post();
        post.title = req.body.title;
        post.short_description = req.body.excerpt
        post.full_text = req.body.body;

        post.save(function(err) {
            if (err) {
                console.log(err);
                return;
            } else {
                req.flash('success', "The post was successfully added");
                req.session.save(() => res.redirect('/dashboard'));
            }
        });
    }
}

Модель Post:

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

Сообщения об ошибках не отображаются в виде, который выглядит следующим образом:

<div id="messages" class="text-center">
    <% Object.keys(messages).forEach(function (type) { %>
        <% messages[type].forEach(function (message) { %>
            <div class="alert alert-<%= type %>"><%= message %></div>
        <% }) %>
    <% }) %>
</div>

ОБНОВЛЕНИЕ:

Индекс. js Файл в root имеет этот код:

const express = require("express");
const dotenv = require("dotenv");
const mongoose = require("mongoose");
const path = require("path");
const morgan = require("morgan");
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const expressLayouts = require("express-ejs-layouts");
const flash = require("express-flash");
const session = require("express-session");
const app = express();

dotenv.config();

//Conect to MONGODB
mongoose
  .connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true
  })
  .then(() => {
    console.log("conected");
  });

mongoose.connection.on("error", err => {
  console.log(`DB connection error: ${err.message}`);
});

// Set static directory
app.use(express.static(path.join(__dirname, "public")));

// Set views directory
app.set("views", path.join(__dirname, "views"));

// Set view engine
app.set("view engine", "ejs");

// Use Express Layouts
app.use(expressLayouts);

// Morgan Middleware
app.use(morgan("dev"));

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

app.use(cookieParser());

// Express Sessions Middleware
app.use(session({
  secret: '123',
  resave: true,
  saveUninitialized: true
}));

// Express Messages Middleware
app.use(flash());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

// Bring the Dashboard
const dashboardRoute = require("./routes/admin/dashboard");

// Get Dashboard Routes
app.use('/dashboard', dashboardRoute);

Что я делаю не так?

Ответы [ 8 ]

3 голосов
/ 17 марта 2020
exports.addPost = (req, res, next) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        req.flash('errors', errors.array())
        req.session.save(() => res.redirect('../addpost'));
        //return res.status(400).send(errors.array());
    } else {
            const post = new Post();
                post.title = req.body.title;
                post.short_description = req.body.excerpt
                post.full_text = req.body.body;

            post.save(function(err){
                    if(err){
                            console.log(err);
                            return;
                    } else {
                        req.flash('success', "The post was successfully added");
                        req.session.save(() => res.redirect('/dashboard'));
                    }
            });
    }
}

messages.e js

<div id="messages" class="text-center">
<% Object.keys(messages).forEach(function (type) { %>
    <% messages[type].forEach(function (message) { %>
        <% if (type === 'errors') {%>
            <div class="alert alert-<%= type %>"><%= message.msg %></div>
        <%} else { %>
            <div class="alert alert-<%= type %>"><%= message %></div>
        <% } %>
    <% }) %>
<% }) %>

Полагаю, это то, что вы намеревались сделать

1 голос
/ 16 марта 2020

это не ошибка с express -validators, это способ работы валидаторов в случае промежуточного программного обеспечения.

На уровне root создайте каталог с именем utils, а внутри каталога - валидацию. js файл и добавьте в него свой код проверки:

утилиты / проверки. js

const { check } = require('express-validator');
exports.addPostCheck = [
    check('title', 'The title field id required')
    .not()
    .isEmpty(),
    check('excerpt', 'The excerpt field id required')
    .not()
    .isEmpty(),
    check('body', 'The full text field id required')
    .not()
    .isEmpty()
];

В маршрутах / панели инструментов. js включает проверку. js

const validator = require('../../utils/validation.js');

Change Line No: 16
From: 
router.post('/post/add', dashboardController.addPost);
To:
router.post('/post/add', validator.addPostCheck, dashboardController.addPost);

В контроллерах / администраторе / панели управления. js

Change Line No: 2
From: 
const { check, validationResult } = require('express-validator');
To:
const { validationResult } = require('express-validator');

Remove Line Nos 29 to 39.

Ссылка

1 голос
/ 11 марта 2020

из того, что я вижу в документации express -validator , вам нужно предоставить массив правил проверки (те checks вверху вашего контроллера), когда вы определяете маршрут. Для них не имеет особого смысла находиться в верхней части обработчика запросов, поскольку express -validator не сможет получить доступ к контексту, который предоставляет запрос для проверки.

Итак, в маршрутизаторе вам нужно что-то вроде этого:

маршрутизатор / интерфейс / сообщения. js

const validationRules = [// Form validation rules
        check('title', 'The title field id required')
        .not()
        .isEmpty(),
    check('excerpt', 'The excerpt field id required')
        .not()
        .isEmpty(),
 check('body', 'The full text field id required')
        .not()
        .isEmpty()];
// create new post
router.post('/', validationRules, postsController.addPost);

контроллеры /front-end/posts.js

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

        const errors = validationResult(req);

        if (!errors.isEmpty()) {
            console.log(errors.array());
     }

        if (!errors.isEmpty()) {
            res.render('admin/addpost', {
            layout: 'admin/layout',
             website_name: 'MEAN Blog',
             page_heading: 'Dashboard',
             page_subheading: 'Add New Post',
             errors: errors
            });
            req.flash('danger', errors);
            req.session.save(() => res.redirect('/dashboard'));
        } else {
                const post = new Post();
                    post.title = req.body.title;
                    post.short_description = req.body.excerpt
                    post.full_text = req.body.body;

                post.save(function(err){
                       if(err){
                          console.log(err);
                          return;
                        } else {
                          req.flash('success', "The post was successfully added");
                          req.session.save(() => res.redirect('/dashboard'));
                        }
                });
        }
}

Все остальное кажется нормальным, по крайней мере, из кода, который вы опубликовали.

1 голос
/ 10 марта 2020

попробуйте изменить выражение if с этого:

   if (!errors.isEmpty()) {
        console.log('there are no validation errors');
    } else {
        console.log(errors);
    }
}

на это:

    exports.addPost = (req, res, next) => {
        // Form validation rules
        check('title', '<your error message>')
          .not()
          .isEmpty();
        check('excerpt', '<your error message>')
          .not()
          .isEmpty();
       check('body', '<your error message>')
          .not()
          .isEmpty();

        const errors = validationResult(req);

        const errors = validationResult(req);
        if (!errors.isEmpty()) {
           console.log(errors.array());
        }
}

Редактировать

Если вы хотите отправить ответ вашему интерфейсу, замените команду console.log() на res.send(), а затем проанализируйте ответ в вашем интерфейсе следующим образом:

if (!errors.isEmpty()) {
           return res.send(errors.array());
         // can also send an status and catch it
        // by sending res.status(400).send(errors.array());
        }

Надеюсь, это имеет смысл

1 голос
/ 06 марта 2020

Вы визуализируете шаблон, затем пытаетесь показать fla sh, а затем снова перенаправить. Измените это на

req.flash('danger', errors);
req.session.save(() => res.redirect('/dashboard'));

Забудьте рендер ... Для вас нет смысла иметь его там. Что делает рендер, он рендерит и возвращает шаблон. Поэтому ваш req.fla sh и перенаправление никогда не происходят или это происходит после того, как заголовок уже отправлен.

res.render () определение:

Отображает представление и отправляет визуализированная HTML строка для клиента. Необязательные параметры:

locals, объект, свойства которого определяют локальные переменные для представления. обратный вызов, функция обратного вызова. Если указан, метод возвращает возможную ошибку и отображаемую строку, но не выполняет автоматический ответ. При возникновении ошибки метод вызывает next (err) для внутреннего использования.

AND

exports.addPost = (req, res, next) => {
   // Form validation rules
    req.check('title').not().isEmpty().withMessage("The title field is mandatory");
    req.check('body').not().isEmpty().withMessage("The full text field is mandatory");

   const errors = req.validationErrors();
0 голосов
/ 17 марта 2020

Я применил решение, предоставленное Saravanakumar TN, с небольшой модификацией в messages.e js.

У меня есть: это в контроллере:

exports.addPost = (req, res, next) => {
  const errors = validationResult(req);
  const post = new Post();
  if (!errors.isEmpty()) {
    req.flash('danger', errors.array());
    req.session.save(() => res.redirect('../addpost'));
 } else {
    post.title = req.body.title;
    post.short_description = req.body.excerpt
    post.full_text = req.body.body;

    post.save(function(err) {
        if (err) {
            console.log(err);
            return;
        } else {
            req.flash('success', "The post was successfully added");
            req.session.save(() => res.redirect('/dashboard'));
        }
    });
  }
}

По виду:

<div id="messages" class="text-center">
    <% Object.keys(messages).forEach(function (type) { %>
            <% messages[type].forEach(function (message) { %>
                    <div class="alert alert-success <% if (type === 'danger') { %> alert-dismissible <% } %> alert-<%= type %>">
                        <% if (type === 'danger') { %>
                            <button type="button" class="close" data-dismiss="alert">&times;</button>
                            <%= message.msg %>
                        <%} else { %>
                            <%= message %>
                        <% } %>
                </div>
            <% }) %>
    <% }) %>
</div>
0 голосов
/ 14 марта 2020

используйте этот код в индексе. js, чтобы получить локальные сообщения об ошибках fla sh в E JS,

app.use(function (req, res, next) {
    res.locals.messages = req.flash();
    next();
});
0 голосов
/ 05 марта 2020

Может быть, вам следует начать с этого https://express-validator.github.io/docs/, а затем постепенно настраивать его в соответствии с вашими потребностями, чтобы вы могли обнаружить любую ошибку на этом пути.

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