簡體   English   中英

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

[英]KoaJS ctx.redirect() causing ERR_TOO_MANY_REDIRECTS in Chrome

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

考慮您的中間件:

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') 將為每個請求執行ctx.redirect('/login')

這將做兩件事:

  • 將HTTP響應代碼設置為302,告訴瀏覽器執行重定向
  • Location標頭設置為/login ,告訴瀏覽器要重定向到的位置

考慮到這種情況為每個請求,你在一個循環結束了:請求/重定向到/login ,其本身被重定向到/login ,這也是重定向到/login ,循環往復。 有時,瀏覽器會放棄並發出ERR_TOO_MANY_REDIRECTS錯誤。

FWIW,在調用ctx.redirect() ,通常會結束請求,例如:

if (s != '1213') {
    return ctx.redirect('/login')
}

對於您而言,您不會結束請求,這意味着該請求將被傳遞到路由器。

為了回答您的評論 ,我假設您使用了以下方法:

if (s != '1213') {
    ctx.url = '/login';
}

您更改了路由器將檢查以查看其應調用哪個處理程序的URL。 有點像內部重定向或“重寫”:對/的請求在內部處理,就好像是對/login的請求一樣。

不過,這不是您想要的,因為它可能會使瀏覽器感到困惑。 正確的方法是使用ctx.redirect()發出適當的重定向,這將使瀏覽器更改位置欄中的URL並發出新的請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM