我正在尝试将 自定义中间件 添加到自定义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...
}
当我运行上面标记为“ Not working” 的代码时,我希望next.js处理它可以处理的所有请求,然后回退到 customMiddleware 。实际发生的是,它永远不会回退到 customMiddleware ,它只会为未知路径返回 404 。
由于当前的NextJS代码似乎无法实现,因此我将其添加为file。
答案 0 :(得分:0)
为了说明我在上面的评论:
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
}
}