next.js 中间件,NextResponse.redirect() 在使用 map 或 foreach 时不起作用,但在使用 for 循环时起作用

Seb*_*hio 2 middleware next.js

//这行不通

rules.filter(rule => rule.type === 'redirect' && new RegExp(rule.rule).exec(pathname.slice(1)))
    .map(rule => { 
        console.log('match');
        const url = req.nextUrl.clone()
        url.pathname = rule.destination
        return NextResponse.redirect(url)
    })
Run Code Online (Sandbox Code Playgroud)

//这确实有效

for (let rule of rules) { 
        const regex: RegExp = new RegExp(rule.rule)
        if(regex.exec(pathname.slice(1)) && rule.type === 'redirect') {
            console.log('match');
            const url = req.nextUrl.clone()
            url.pathname = rule.destination
            return NextResponse.redirect(url)
          }
        }
Run Code Online (Sandbox Code Playgroud)

中间件已经通过 de for 循环运行良好

Seb*_*hio 5

Reddit 给了我解决方案,我把它留在这里

里面的 return 语句map只是添加到映射输出数组中。

for 循环中的 return 语句退出该函数。

如果中间件返回 NextResponse.redirect(),Next.js 将重定向,就像使用 for 循环和 return 语句一样。

 let result
    rules.filter(rule => rule.type === 'redirect' && new RegExp(rule.rule).exec(pathname.slice(1)))
    .map(rule => {
    console.log('match');
    url.pathname = rule.destination
    result = NextResponse.redirect(url)
    })

return result
Run Code Online (Sandbox Code Playgroud)