【发布时间】:2020-09-27 06:37:44
【问题描述】:
我正在使用express + passport + nextjs 来设置将使用 OpenID Connect 执行身份验证的应用。用户数据使用express-session 存储在请求对象上,这会像往常一样在每个请求上为我提供req.user。
现在我想将用户信息传递给前端,以便我可以将其用于某些事情,但似乎没有任何一致的方法可以为所有请求执行此操作。我可以将getServerSideProps 用于单个页面,但不能通过_document 或_app 用于每个页面。我该如何设置?
这是我目前的_document.tsx
import Document, {
Head,
Main,
NextScript,
DocumentContext,
} from "next/document"
export default class Doc extends Document {
public static async getInitialProps(ctx: DocumentContext) {
const req: any = ctx.req
console.log("req/user", `${!!req}/${!!(req && req.user)}`)
const initialProps = await Document.getInitialProps(ctx)
return {
...initialProps,
user: req?.user || "no user",
}
}
public render() {
return (
<html>
<Head />
<body>
<Main />
<NextScript />
</body>
</html>
)
}
}
它似乎只在第一个请求期间返回请求对象,而不是任何后续页面刷新。
我创建了一个小型 repo,在此处重现该问题:https://github.com/rudfoss/next-server-custom-req
没有办法以简单的方式对所有页面执行此操作似乎很荒谬。
编辑:作为参考,这是我的server.js。它是 repo 中唯一的其他相关文件
const express = require("express")
const next = require("next")
const dev = process.env.NODE_ENV !== "production"
const start = async () => {
console.log("booting...")
const server = express()
const app = next({ dev, dir: __dirname })
const handle = app.getRequestHandler()
await app.prepare()
server.use((req, res, next) => {
req.user = {
authenticated: false,
name: "John Doe",
}
next()
})
server.get("*", handle)
server.listen(3000, (err) => {
if (err) {
console.error(err)
process.exit(1)
}
console.log("ready")
})
}
start().catch((error) => {
console.error(error)
process.exit(1)
})
【问题讨论】: