Не удалось прочитать все выбранные значения флажка из pug в express - PullRequest
0 голосов
/ 25 апреля 2020

Учебное пособие Express MDN здесь использует следующий код для извлечения значений флажков из pug.

Из основного кода req.body.genre должен возвращать массив выбранных значений из формы, как показано ниже

 div.form-group
      label Genre:
      div
        for genre in genres
          div(style='display: inline; padding-right:10px;')
            input.checkbox-input(type='checkbox', name='genre', id=genre._id, value=genre._id, checked=genre.checked )
            label(for=genre._id) #{genre.name}
    button.btn.btn-primary(type='submit') Submit

при ссылке на req.body.genre в разделе кода ниже в последней функции промежуточного программного обеспечения, где создается новый экземпляр модели Book, он возвращает только первый значение хранится в виде строки. Следовательно, поле жанра всегда заканчивается сохранением только одного значения, даже если в форме было отмечено несколько флажков.

exports.book_create_post = [
    // Convert the genre to an array.
    (req, res, next) => {
        if(!(req.body.genre instanceof Array)){
            if(typeof req.body.genre==='undefined')
            req.body.genre=[];
            else
            req.body.genre=new Array(req.body.genre);
        }
        next();
    },

    // Validate fields.
    body('title', 'Title must not be empty.').isLength({ min: 1 }).trim(),
    body('author', 'Author must not be empty.').isLength({ min: 1 }).trim(),
    body('summary', 'Summary must not be empty.').isLength({ min: 1 }).trim(),
    body('isbn', 'ISBN must not be empty').isLength({ min: 1 }).trim(),

    // Sanitize fields.
    sanitizeBody('*').escape(),
    sanitizeBody('genre.*').escape(),
    // Process request after validation and sanitization.
    (req, res, next) => {


        // Extract the validation errors from a request.
        const errors = validationResult(req);

        // Create a Book object with escaped and trimmed data.
        var book = new Book(
          { title: req.body.title,
            author: req.body.author,
            summary: req.body.summary,
            isbn: req.body.isbn,
            genre: req.body.genre
           });

Поле жанра было определено для хранения массива значений

var BookSchema = new Schema(
  {
    title: {type: String, required: true},
    author: {type: Schema.Types.ObjectId, ref: 'Author', required: true},
    summary: {type: String, required: true},
    isbn: {type: String, required: true},
    genre: [{type: Schema.Types.ObjectId, ref: 'Genre'}]
  }
);

Что я должен сделать, чтобы получить req.body.genre в виде массива выбранных значений ?

1 Ответ

0 голосов
/ 29 апреля 2020

Я нашел виновника

Эта строка кода для express валидатора создала проблему

sanitizeBody ('*'). Escape ()

заменила ее с

sanitizeBody('author').escape(),
sanitizeBody('title').escape(),
sanitizeBody('isbn').escape(),
sanitizeBody('summary').escape(),
sanitizeBody('genre.*').escape(),

Теперь все отлично работает. теперь массив передается через тело запроса.

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