SailsJS:URL含文件扩展名时无法调用控制器动作
解决SailsJS带扩展名URL无法命中自定义路由的问题
问题根源
SailsJS默认会优先处理带文件扩展名的URL,把它们当成静态资源去assets目录里查找,只有找不到对应静态文件时,才会尝试匹配自定义路由。这就是为什么你访问带.png这类后缀的URL会返回404——Sails没找到对应的静态文件,也没走到你的自定义路由上。
解决方案
方案1:给目标路由加skipAssets配置
直接在config/routes.js里给你的目标路由加上skipAssets: true,强制Sails跳过静态资源检查,直接走路由对应的控制器:
'/api/v1/uploads/products/:productId/:filename': { controller: 'image', action: '你的动作名称', // 替换成你实际的动作名 skipAssets: true }
这个配置相当于告诉Sails:哪怕这个URL看起来像静态文件,也别去查assets目录,直接走我这个路由。
方案2:全局调整中间件顺序
要是你需要让所有路由都优先于静态资源处理,可以修改config/http.js里的middleware.order,把router移到serveStatic前面:
module.exports.http = { middleware: { order: [ 'cookieParser', 'session', 'bodyParser', 'router', // 把router挪到serveStatic前面 'serveStatic', 'www', 'favicon', ], }, };
注意这种方式是全局生效的,可能会影响正常静态资源的访问,得确保你的路由不会误拦截合法的静态文件请求。
方案3:用通配路由针对性覆盖
如果不想全局修改,也可以用通配路由覆盖/api/v1/uploads/products/下的所有请求,同样加上skipAssets:
'/api/v1/uploads/products/*': { controller: 'image', action: '你的动作名称', skipAssets: true }
适合这个路径下所有子URL都需要走控制器的场景。
验证
改完配置后重启Sails服务,再访问带扩展名的URL,就能正常命中image控制器的指定动作了。
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

