KoaJS ctx.redirect()在Chrome中导致ERR_TOO_MANY_REDIRECTS

时间:2018-08-13 12:49:48

标签: javascript redirect koa2

我是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

1 个答案:

答案 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')

这将做两件事:

  • 将HTTP响应代码设置为302,告诉浏览器执行重定向
  • 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并发出新的请求。