最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

将自定义中间件放在自定义next.js服务器的链中?

IT培训 admin 5浏览 0评论

将自定义中间件放在自定义next.js服务器的链中?

我正在尝试将自定义中间件添加到自定义next.js服务器。但是我没有特定的路径模式可以将我的中间件绑定到,因为这些URL是由我们的CMS生成的,几乎可以是任何东西。所以我想在链中添加我的中间件,可以这么说。作为最后的全能。但我找不到任何关于如何实现这一目标的文档。

我试图简单地将我的中间件放在最后,但这导致它从未被调用。

工作但丑陋,而不是未来证明:

//Our custom middleware first
server.get('*', [customMiddleware, standardMiddleware])
...
const customMiddleware = async function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Custom middleware. pathname: " + pathname)
  if (pathname.startsWith("/babel/") || pathname.startsWith("/_next/") || pathname.startsWith("/static/") ...etc) {
    return next()
  }
  ///Custom logic here...
}

const standardMiddleware = function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Standard middleware. pathname: " + pathname)
  return handle(req, res)
}

不工作:

//Our custom middleware last
server.get('*', [standardMiddleware, customMiddleware])
...
const standardMiddleware = function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Standard middleware. pathname: " + pathname)
  return handle(req, res)
}

const customMiddleware = async function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Custom middleware. pathname: " + pathname)
  ///Custom logic here...
}

当我运行上面标记为“不工作”的代码时,我希望next.js处理它可以处理的所有请求,然后回退到customMiddleware以获取所有其他请求。实际发生的事情是它永远不会回退到customMiddleware,它只是为未知路径返回404。

更新2019-02-13

由于目前的NextJS代码似乎不可能,因此我将其添加为feature request。

回答如下:

为了说明我上面的评论:

const standardMiddleware = function (req, res, next) { // next is a callback argument here
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Standard middleware. pathname: " + pathname)
  return handle(req, res, next); // pass it along
}
...
function handle(req, res, next) {
  ...
  if (noRouteEventuallyMatched) {
    // res.status(404).sendFile('/path/to/my404.html');
    next(); // instead of setting res, call next so that the next element in the chain is tried
  }
}

将自定义中间件放在自定义next.js服务器的链中?

我正在尝试将自定义中间件添加到自定义next.js服务器。但是我没有特定的路径模式可以将我的中间件绑定到,因为这些URL是由我们的CMS生成的,几乎可以是任何东西。所以我想在链中添加我的中间件,可以这么说。作为最后的全能。但我找不到任何关于如何实现这一目标的文档。

我试图简单地将我的中间件放在最后,但这导致它从未被调用。

工作但丑陋,而不是未来证明:

//Our custom middleware first
server.get('*', [customMiddleware, standardMiddleware])
...
const customMiddleware = async function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Custom middleware. pathname: " + pathname)
  if (pathname.startsWith("/babel/") || pathname.startsWith("/_next/") || pathname.startsWith("/static/") ...etc) {
    return next()
  }
  ///Custom logic here...
}

const standardMiddleware = function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Standard middleware. pathname: " + pathname)
  return handle(req, res)
}

不工作:

//Our custom middleware last
server.get('*', [standardMiddleware, customMiddleware])
...
const standardMiddleware = function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Standard middleware. pathname: " + pathname)
  return handle(req, res)
}

const customMiddleware = async function (req, res, next) {
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Custom middleware. pathname: " + pathname)
  ///Custom logic here...
}

当我运行上面标记为“不工作”的代码时,我希望next.js处理它可以处理的所有请求,然后回退到customMiddleware以获取所有其他请求。实际发生的事情是它永远不会回退到customMiddleware,它只是为未知路径返回404。

更新2019-02-13

由于目前的NextJS代码似乎不可能,因此我将其添加为feature request。

回答如下:

为了说明我上面的评论:

const standardMiddleware = function (req, res, next) { // next is a callback argument here
  const parsedUrl = parse(req.url, true)
  const { pathname, query } = parsedUrl
  console.log("Standard middleware. pathname: " + pathname)
  return handle(req, res, next); // pass it along
}
...
function handle(req, res, next) {
  ...
  if (noRouteEventuallyMatched) {
    // res.status(404).sendFile('/path/to/my404.html');
    next(); // instead of setting res, call next so that the next element in the chain is tried
  }
}
发布评论

评论列表 (0)

  1. 暂无评论