比如一个请求的URL在我的路由里没有匹配的 koa-router会自动返回Not Found 那么我想返回一个统一的404页,该怎么做,在哪里拦截 我使用的ejs模板
Not Found
在正常路由之后放一个输出 404 的路由 … 没找到 Handler 不就是 Not Found 么
@magicdawn 我的意思是指定一个自己写好的静态的ejs 谢谢回答
可以参考这段代码: https://github.com/superalsrk/koa2-boilerplate/blob/master/src/routes/index.js 设置一个default router, 该路由返回404, 返回自定义页面的话可以加个模板引擎, 更简单暴力的方法是直接fs读文件流并返回
ctx.type = 'html’ ctx.body = require(‘fs’).createReadStream(__dirname + ‘/…/public/main.html’)
@hezhongfeng
你都有controller了, 是输出 html 还是 json 不是随你么…
// 404 app.use(async (ctx) => { ctx.status = 404 await ctx.render('common/404') })
@magicdawn 我会输出 就是不知道在哪输出0.0
@superalsrk @eyblog @magicdawn 谢谢 我现在知道怎么做了 在所有的路由都没有匹配之后,直接设置状态为404,并且返回我的404页面 如果前面有匹配的就轮不到它返回404了,直接会返回相应的页面
@eyblog 你好 麻烦问一下, 除了这种方式, 可以在 路由文件中 进行设定吗? 可以在下面的 index.js 文件中添加吗?
/** * 路由清单列表 */ const router = require('koa-router')(); // 引入自定义路由 目录 const home = require('./homepage/home'); const login = require('./user/login'); const register = require('./user/register'); router.use('/', home.routes(), home.allowedMethods()); // 加载首页路由 router.use('/login', login.routes(), login.allowedMethods()); // 加载登录页路由 router.use('/register', register.routes(), register.allowedMethods()); // 加载注册页路由 module.exports = router;
@eyblog 我现在的写法是在app.js中添加的, 按照你的说法
app.use(async (ctx) => { console.log(ctx.status); switch (ctx.status) { case 404: await ctx.render('404'); break; case 500: await ctx.render('500'); break; } })
@hezhongfeng 麻烦问下 500 的友好界面 怎么指定
index.js:
app.use(middleware.catchError);
middleware:
const catchError = async (ctx, next) => { try { await next(); if (ctx.status === 404) { ctx.throw(404); } } catch (err) { console.error(err.stack); const status = err.status || 500; ctx.status = status; if (status === 404) { await ctx.render("errors/404.njk"); } else if (status === 500) { await ctx.render("errors/500.njk"); } } };
用middleware实现,另外注意这个catchError的放置位置。比较好的做法是放在一些log类middleware之后,session、cache类middleware之前,注意看看koa的洋葱模型就知道了。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
在正常路由之后放一个输出 404 的路由 … 没找到 Handler 不就是 Not Found 么
@magicdawn 我的意思是指定一个自己写好的静态的ejs 谢谢回答
可以参考这段代码: https://github.com/superalsrk/koa2-boilerplate/blob/master/src/routes/index.js 设置一个default router, 该路由返回404, 返回自定义页面的话可以加个模板引擎, 更简单暴力的方法是直接fs读文件流并返回
ctx.type = 'html’ ctx.body = require(‘fs’).createReadStream(__dirname + ‘/…/public/main.html’)
@hezhongfeng
你都有controller了, 是输出 html 还是 json 不是随你么…
@magicdawn 我会输出 就是不知道在哪输出0.0
@superalsrk @eyblog @magicdawn 谢谢 我现在知道怎么做了 在所有的路由都没有匹配之后,直接设置状态为404,并且返回我的404页面 如果前面有匹配的就轮不到它返回404了,直接会返回相应的页面
@eyblog 你好 麻烦问一下, 除了这种方式, 可以在 路由文件中 进行设定吗? 可以在下面的 index.js 文件中添加吗?
index.js
@eyblog 我现在的写法是在app.js中添加的, 按照你的说法
app.js
@hezhongfeng 麻烦问下 500 的友好界面 怎么指定
index.js:
middleware:
用middleware实现,另外注意这个catchError的放置位置。比较好的做法是放在一些log类middleware之后,session、cache类middleware之前,注意看看koa的洋葱模型就知道了。