javascript - 将自定义中间件放在自定义 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 代码似乎无法做到这一点,因此我将其添加为功能请求。
解决方案
为了说明我上面的评论:
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
}
}
推荐阅读
- java - Java:从使用对象获取数组创建 CSV
- apache-spark - Databricks 内存的最大容量是多少?
- android - FlatList 当许多屏幕在他们之前的路线上时缓慢并开始闪烁。?
- tensorflow - 如何解决有关 Tensorflow 和 cuda 兼容性的问题?
- javascript - 匹配除我的模式以外的所有内容(RegEx)
- python - ValueError:将文件上传到 s3 存储桶时,文件名必须是字符串
- angular - Angular 中的 URL 路径构建
- reactjs - Apollo 客户端缓存与 Redux
- php - 如何在 WooCommerce 中使用 api 和优惠券代码删除优惠券
- applescript - 有没有办法用 quicktime 和 applescript 暂停录音和恢复?