我是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发布于 2018-08-13 13:21:18
考虑一下您的中间件:
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也被无限地重定向到/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并发出新的请求。
https://stackoverflow.com/questions/51822794
复制相似问题