Экспресс-валидатор: Пользовательская проверка с асинхронными функциями

0

Вопрос

В настоящее время я пытаюсь проверить некоторые входные данные в Express с помощью экспресс-валидатора. Я знаю, что обычно его передают как отдельное промежуточное программное обеспечение в маршрут, но мне нужен был доступ к res возражаю, поэтому мне пришлось написать это так, как вы видите ниже.

Та часть, с которой я борюсь, - это custom валидатор. Я бы хотел, чтобы он вызывал асинхронную функцию store.todoListTitleExists(title) это запрашивает базу данных и проверяет, существует ли уже заголовок. Если заголовок не существует, я намерен сохранить сообщение об ошибке, которое позже смогу отобразить в виде флэш-сообщения.

В настоящее время этот код не работает. Я просмотрел документацию, но, похоже, не могу понять, как заставить этот пользовательский валидатор + сообщение об ошибке работать должным образом, поскольку он вызывает асинхронную функцию. Любая помощь будет оценена.

Спасибо!

app.post("/lists/:todoListId/edit", 
    (req, res) => {
    let store = res.locals.store;
    let todoListId = req.params.todoListId;
    let title = req.body.todoListTitle;

    await body('todoListTitle')
          .trim()
          .isLength({ min: 1 })
          .withMessage("The list title is required.")
          .isLength({ max: 100 })
          .withMessage("The list title cannot be over 100 characters")
          .custom(store.todoListTitleExists(title).then(titleExists => {
            if(titleExists) return Promise.reject('Title already exists');
          }))
2

Лучший ответ

0

попробуй это

body("feildName", "Feild must be selected")
.custom(value=> {

    titleExists=await store.todoListTitleExists(value)
    if(titleExists){
    Promise.reject('title exists')
    }
    return true


    return true

}),
2021-12-24 05:31:48
-1

Экспресс-валидатор предназначен для очистки и проверки данных, отправляемых между клиентом и сервером. Чтобы справиться с этим масштабируемым способом, я бы рекомендовал использовать файл для обработки всех запросов на публикацию ваших сайтов (что-то вроде routes.js например).

Вот пример пользовательского маршрутизатора, который отображает сообщение об ошибке в случае сбоя проверки :

body("feildName", "Feild must be selected")
    .custom(val => {

        if (val.feildName == "Select...") return false

        return true

    }),

Как только вы изолируете всю маршрутизацию в определенный файл, вы можете добавить аргументы, подобные приведенному ниже примеру, для сообщений об ошибках, которые будут отображаться вместе со страницей (лично я использую шаблоны ejs, поэтому эти сообщения об ошибках отображаются с помощью следующего кода :

**controller.js**
    const errors = validationResult(req);
    const {
        body
    } = req;

    if (!errors.isEmpty()) {
        return res.render('index', {
            error: errors.array()[0].msg
        });
    }

    res.render("index");

**index.ejs**
<div class="error">
        <% if(typeof error !== 'undefined'){ %>
              <div class="err-msg"><%= error %></div>
        <% } %>
</div>
2021-11-23 19:09:05

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................