我是KoaJS的新手。现在播放。我正在尝试使用中间件将所有请求重定向到特定的URL。这似乎是在Chrome中生产ERR_TOO_MANY_REDIRECTS
的产品。我做了很多调试工作。无法找出问题所在。
index.js
// App
const Koa = require('koa')
const app = new Koa()
// Parser
const bodyParser = require('koa-body')
app.use(bodyParser())
// Session
const session = require('koa-session')
app.keys = ['asdfasdf@#$ASDf1#$@5rasdf']
app.use(session(app))
// THIS MIDDLEWARE
app.use(async (ctx, next) => {
ctx.session.user = '121' // This is all playground. No production stuff.
const s = ctx.session.user
if (s != '1213') {
ctx.redirect('/login')
}
await next()
})
// Router
const common = require('./routes')
app.use(common.routes())
// Server
app.listen(3000, () => { console.log('Listening on http://localhost:3000') })
routes.js
const Router = require('koa-router')
const router = new Router()
// const User = require('./user')
router.get('/', async ctx => {
ctx.body = 'Home Page'
})
router.get('/login', async ctx => {
ctx.body = 'Login Page'
})
module.exports = router
答案 0 :(得分:0)
考虑您的中间件:
app.use(async (ctx, next) => {
ctx.session.user = '121' // This is all playground. No production stuff.
const s = ctx.session.user
if (s != '1213') {
ctx.redirect('/login')
}
await next()
})
由于s != '1213'
始终求值为“ true”,因此对于每个请求都会执行ctx.redirect('/login')
。
这将做两件事:
Location
标头设置为/login
,告诉浏览器重定向到的位置考虑到每个请求都会发生这种情况,您最终陷入循环:对/
的请求被重定向到/login
,该请求本身又被重定向到/login
,后者也被重定向无限地转到/login
。有时,浏览器会放弃并发出ERR_TOO_MANY_REDIRECTS
错误。
FWIW,在调用ctx.redirect()
之后,通常会结束请求,例如:
if (s != '1213') {
return ctx.redirect('/login')
}
对于您而言,您不会结束请求,这意味着该请求将被传递到路由器。
要回答your comment,我假设您使用了此方法:
if (s != '1213') {
ctx.url = '/login';
}
您更改了路由器将检查以查看其应调用的处理程序的URL。类似于内部重定向或“重写”:对/
的请求在内部 进行处理,就好像是对/login
的请求一样。
这不是您想要的东西,因为它可能会使浏览器感到困惑。正确的方法是使用ctx.redirect()
发出适当的重定向,这将使浏览器更改位置栏中的URL并发出新的请求。