0

我有以下两个中间件功能:

function validateEmail(req, res, next) {
  console.log('email validation');
  if (req.body.email && req.body.email.match(EMAIL_REGEX)) {
    console.log('email OK!');
    return next(req, res);
  } else {
    console.log('email wrong');

    res.json({ message: 'email invalid'});
  }
}
function  validateOriginHeader(req, res, next) {
  if (ORIGIN_WHITELIST.includes(req.headers.origin)) {
    console.log('header OK!');
    return next(req, res);
  } else {
    console.log('header wrong!');
    res.status(403);
    res.end('game over');
  }
}

我尝试在下一个连接设置中使用它们,pages/api我在其中定义了 onError 和 onNoMatch 选项:

// factory fn returns new instance of newConnect with default setup
function factory() {
  return nextConnect({
    onError(err, req, res) {
      console.log('error?:', Object.keys(err));
      res.status(500).json({ message: 'Internal Server Error' });
    },
    onNoMatch(req, res) {
      res.status(405).json({ message: `Method ${req.method} is not allowed.` });
    },
  });
}
// pages/api/subscribe.js 
export default factory()
  .use(validateOriginHeader)
  .use(validateEmail)
  .post(async (req, res) => {
    try {
      const mailchimpRes = await mailchimp.subscribe(req.body);
      res.json(mailchimpRes);
    } catch (e) {
      res.json(e);
    }
  });

问题:

只有第一个中间件执行(在服务器控制台上打印 'header OK!')。validateEmail 中的控制台从不打印。当我在下一个连接选项中定义的 onError 处理程序中控制台错误时,它看起来像请求对象,即。它包含带有电子邮件有效负载的正文。

调用路由会导致 500:返回内部服务器错误(在 onError 处理程序中定义)。

这个设置有什么问题?

使用的版本:

“下一个”:“11.1.2” “下一个连接”:“0.10.2”

4

1 回答 1

2

您必须next()使用空参数而不是next(req, res). 使用参数调用next()会导致onError

于 2021-10-14T08:39:01.033 回答