[英]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')
。
這將做兩件事:
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.