首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KoaJS ctx.redirect()在Chrome中引起ERR_TOO_MANY_REDIRECTS

KoaJS ctx.redirect()在Chrome中引起ERR_TOO_MANY_REDIRECTS
EN

Stack Overflow用户
提问于 2018-08-13 12:49:48
回答 1查看 2.3K关注 0票数 1

我是KoaJS的新手。现在玩得有点。我试图使用一个中间件将所有请求重定向到一个特定的URL。这似乎产生了Chrome版的ERR_TOO_MANY_REDIRECTS。我试了很多调试。搞不懂哪里出了问题。

index.js

代码语言:javascript
复制
// 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

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-13 13:21:18

考虑一下您的中间件:

代码语言:javascript
复制
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也被无限地重定向到/login。在某个时候,浏览器放弃并发出一个ERR_TOO_MANY_REDIRECTS错误。

FWIW调用ctx.redirect()之后,通常会结束请求,例如:

代码语言:javascript
复制
if (s != '1213') {
    return ctx.redirect('/login')
}

在您的情况下,您不会结束请求,这意味着它将被传递给路由器。

要回答your comment,我想您使用了以下方法:

代码语言:javascript
复制
if (s != '1213') {
    ctx.url = '/login';
}

您可以更改路由器将检查的URL,以查看它应该调用哪个处理程序。有点像内部重定向或“重写”:对/的请求在内部处理,就好像它是对/login的请求一样。

但是,这并不是您想要的,因为它可能会混淆浏览器。正确的方法是使用ctx.redirect()发出适当的重定向,这将使浏览器更改地址栏中的URL并发出新的请求。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51822794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档