簡體   English   中英

如何按路由將參數傳遞給通用Express中間件功能?

[英]How can I pass parameters to a generic Express middleware function on a per-route basis?

我編寫了一個通用的驗證函數,該函數將一個對象作為第一個參數,並帶有一個required的屬性(其中包括字符串數組)。 它用於根據required找到的任何鍵測試傳入的前端數據。 這是外觀的模型-使用下划線檢查isEmpty

驗證器

function validateRequest(options, req, done) {
  const { body } = req;
  const { required } = options;
  const errors = {};

  if (required && required.length) {
    required.forEach(key => {
      const value = `${body[key]}`;

      if (_.isEmpty(value)) {
        errors[key] = 'This field is required';
      }
    });
  }

  if (_.isEmpty(errors)) done({ success: true });
  else done({ success: false, errors });
}

我目前正這樣使用它:

路由/auth.js

router.post('/login', (req, res, next) => {
  validator.validateRequest({
    required: ['identifier', 'password']
  }, req, result => {
    if (!result.success) return res.status(400).send(result);
    next();
  });
}, auth.login);

我希望能夠以更清潔的方式使用它,例如:

router.post('/login', validator.validateRequest({
  required: ['identifier', 'password']
}), auth.login);

我寧願不使用app.use因為它涉及到我必須擔心始終將其放置在路由文件的正確層次結構中,並且在我需要的情況下無法伸縮。 我還將其他參數作為options傳遞,將輸入驗證為數字,正確的郵政編碼等,因此上面的功能比示例更深入。 有沒有辦法讓我逐條路線使用類似的方法? 我的中間件函數必須有一種方法來攔截(req, res, next)而不必每次都寫出來。

答案是使用一個高階函數返回一個將(req, res, next)作為參數的函數,如下所示:

驗證器

function validateRequest(options) {
  return (req, res, next) => {
    const { body } = req;
    const { required } = options;
    const errors = {};

    if (required && required.length) {
      required.forEach(key => {
        const value = `${body[key]}`;

        if (_.isEmpty(value)) {
          errors[key] = 'This field is required';
        }
      });
    }

    if (!_.isEmpty(errors)) {
      res.send({ success: false, errors });
    } else {
      next();
    }
  }
}

然后可以這樣使用:

路由/auth.js

router.post('/login', validateRequest({
  required: ['identifier', 'password']
}), auth.login);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM