【问题标题】:Await sql query gets skipped by express validator?等待 sql 查询被快速验证器跳过?
【发布时间】:2021-11-08 06:38:20
【问题描述】:

我想在提交之前检查用户输入的类别是否真的存在。我使用 express-validator 验证我的字段。正常的 req.checks 像 .exists().trim()... 工作正常但是当我尝试这个时:

.custom(value => {
            return new Promise((resolve, reject) => {
                connection.query("SELECT id FROM cat WHERE cat_name = ?", [value], (err, results) => {
                    if (err)
                        reject(err);
                    if (results[0] == 'undefined')
                        reject(new Error('This topic does not exist or is misspelled.'))
                    resolve();
                })
        });

编辑: 它实际上在中间件中有效,但在函数中无效:/

【问题讨论】:

  • 这可能与connection.querycallback 样式有关,您是否尝试过在connection.query 上使用util.promisify,以便connection.query 可能是awaited?然后您应该能够在connection.query 上使用await 并获得现在可以使用条件逻辑返回的“结果”。

标签: node.js express async-await express-validator


【解决方案1】:

这可能与connection.querycallback 样式有关,您是否尝试过在connection.query 上使用util.promisify 以便connection.query 可能是awaited on?

然后您应该能够在connection.query 上使用await 并获得现在可以使用条件逻辑返回的“结果”。

const promisifedQuery = util.promisify(connection.query)

await req.check('category', 'This category does not exist yet.')
      .custom( async (value) => {
      const results = await promisifedQuery("SELECT id FROM category WHERE cat_name = ?", [value]);
      
        if(results[0].id > 0){
            return true
        }
        return false
    });

【讨论】:

    【解决方案2】:

    根据document

    自定义验证器可能会返回 Promises 以指示异步验证 (将等待),或抛出任何价值/拒绝承诺 使用自定义错误消息。

    注意:如果您的自定义验证器返回一个承诺,它必须拒绝 表示该字段无效。

    这意味着只为自定义函数返回一个 Promise,您可以使用 Promise 语法 (Promise.reject) 或 async/await (throw) 来生成无效结果。

    Promise.reject 示例:

    .custom(value => {
      return new Promise((resolve, reject) => {
        connection.query("SELECT id FROM cat WHERE cat_name = ?", [value], (err, results) => {
          if (err) {
            return reject('Something went wrong!');
          }
    
          if (results[0].id <= 0) { // ???
            return reject('This category does not exist yet');
          }
          resolve();
        });
      });
    })
    

    【讨论】:

    • 感谢您的帮助,但它似乎仍然不起作用。它只是每次都通过而不会出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2013-08-31
    • 2022-11-28
    • 2011-07-16
    • 2022-06-19
    • 2020-02-28
    相关资源
    最近更新 更多