Express NextJS一致地访问每个页面的请求对象

Express NextJS一致地访问每个页面的请求对象,express,next.js,Express,Next.js,我正在使用express+passport+nextjs设置一个应用程序,该应用程序将使用OpenID Connect执行身份验证。使用express session将用户数据存储在请求对象上,它会像往常一样在每个请求上为我提供req.user 现在我想把用户信息传递到前端,这样我就可以用它来做一些事情,但是似乎没有任何一致的方法来处理所有的请求。我可以对单个页面使用getServerSideProps,但不能通过\u document或\u app对每个页面使用。我如何设置这个 这是我当前的\

我正在使用
express
+
passport
+
nextjs
设置一个应用程序,该应用程序将使用OpenID Connect执行身份验证。使用
express session
将用户数据存储在请求对象上,它会像往常一样在每个请求上为我提供
req.user

现在我想把用户信息传递到前端,这样我就可以用它来做一些事情,但是似乎没有任何一致的方法来处理所有的请求。我可以对单个页面使用
getServerSideProps
,但不能通过
\u document
\u app
对每个页面使用。我如何设置这个

这是我当前的
\u文档.tsx

导入文档{
头,,
主要的,
下一个脚本,
文档上下文,
}从“下一个/文档”
导出默认类文档扩展文档{
公共静态异步getInitialProps(ctx:DocumentContext){
const req:any=ctx.req
log(“req/user”,“${!!req}/${!!(req&&req.user)}`)
const initialProps=wait Document.getInitialProps(ctx)
返回{
…初始道具,
用户:req?.user | |“无用户”,
}
}
公共渲染(){
返回(
)
}
}
它似乎只在第一次请求时返回请求对象,而不是页面的任何后续刷新

我创建了一个小型回购协议,在这里复制了该问题:

似乎很可笑的是,没有办法轻松地对所有页面执行此操作

编辑:这是我的
server.js
,仅供参考。这是回购协议中唯一的其他相关文件

const express=require(“express”)
const next=要求(“下一步”)
const dev=process.env.NODE_env!==“生产”
const start=async()=>{
日志(“引导…”)
const server=express()
const app=next({dev,dir:uu dirname})
const handle=app.getRequestHandler()
等待应用程序准备()
服务器使用((请求、恢复、下一步)=>{
请求用户={
认证:假,
姓名:“约翰·多伊”,
}
下一个()
})
server.get(“*”,句柄)
服务器。侦听(3000,(错误)=>{
如果(错误){
控制台错误(err)
进程。退出(1)
}
控制台日志(“就绪”)
})
}
start().catch((错误)=>{
控制台错误(错误)
进程。退出(1)
})

事实证明,我可以覆盖
\u app
上的
getInitialProps
,以实现这一功能:

类MyApp扩展了应用程序{
公共静态异步getInitialProps({
ctx
}:AppContext):承诺{
const req:any=ctx.req
返回{
页面道具:{
用户:req?.user
}
}
}
公共渲染(){
//...
}
}
这将在每个请求上运行,虽然静态优化不起作用,但在我的情况下,我需要信息,所以我愿意接受权衡


编辑:这个答案也可以,但它使用了不再推荐的“旧”基于类的组件语法。有关使用功能组件语法的更现代版本,请参见Karl的答案。

建议通过功能组件执行此操作,如图所示:

///pages//\u app.tsx
从“next/App”导入应用程序,{AppProps,AppContext}
导出默认函数MyApp({Component,pageProps}:AppProps){
返回
}
MyApp.getInitialProps=async(appContext:appContext)=>{
//调用页面的'getInitialProps'并填充'appProps.pageProps'`
const appProps=await App.getInitialProps(appContext)
const req=appContext.ctx.req
返回{
页面道具:{
…appProps.pageProps,
用户:req?.user,
},
}
}
在您的回答中,这将在每个请求上运行,尽管如此,自动静态优化将不会处于活动状态

在以下代码沙盒上尝试在
MyApp.getInitialProps
中更改
pageProps
(不使用
req.user
)的演示:


Nice,那么当页面中定义了
getServerSideProps
getStaticProps
时,该函数也会运行吗?编辑:…哦,我想不是。你能提供一个函数组件版本吗?@Karl现在我已经没有一个可以测试这个的环境了,但是函数方法应该是从
\u应用程序
文件中导出const getInitialProps
。不过我还没有测试过。啊,据我所知,它更像是这样的格式:
const-App=()=>{};App.getInitialProps=async()=>{}在这里查看:好的,发布了答案: