自定义服务器bodyParser和nextauth冲突

问题描述 投票:0回答:1

我有我的...nextauth,按照文档的指导,如下所示:

我有一个自定义服务器:

app.prepare().then(() => {
    const server = express();

    server.use(cors())
    
    server.use('/authuser', authRoutes)
    server.use('/user', userBasicRoutes)
    server.use('/admin', userAdminRoutes)
    
    server.use(async(req, res, next) => {
      try {
        const parsedUrl = parse(req.url, true);
        await handle(req, res, parsedUrl)
      } 
      catch(err){
        console.error("Error occurred handling", req.url, err);
        res.statusCode=500;
        res.end("internal server error");
      }
    });
    ...........

它正在工作,我的 nextauth 登录成功,我可以使用 GET 通过登录的用户会话访问我的服务器路由和控制器文件 (MVC)。但是我意识到如果没有主体解析器,我无法将

request.body
与 POST 请求传递到我的路由器文件。当我尝试
server.use(bodyParser.json())
nextauth 停止工作。所以我尝试使用 bodyParser 单独设置路由器,如下所示:

server.use('/authuser', authRoutes)
server.use('/user', bodyParser.json(), userBasicRoutes)
server.use('/admin', userAdminRoutes)

但它不起作用,正在传递正文数据,但 nextauth 停止工作并出现以下错误消息:

[next-auth][error][CLIENT_FETCH_ERROR] 
https://next-auth.js.org/errors#client_fetch_error undefined {
  error: {},
  url: 'http://localhost:3000/api/auth/session',
  message: undefined
}

当然,如果我将 /user 路由器修改回

server.use('/user', userBasicRoutes)
,nextauth 会再次工作,但我无法在发布请求中传递
request.body
数据。

我的 GET 正在使用身份验证和参数,POST 也正在使用身份验证会话,并且

request.params
request.body
未通过。有什么建议可以解决这个问题吗?

更新 尚未弄清楚,但在确定错误根源方面取得了一些进展。在这条路线里面

server.use('/user', bodyParser.json(), userBasicRoutes)
我有这个方法:

const { getSession }=require("next-auth/react")

exports.getUserID=async(request, result, next)=>{
    const session=await getSession({req:request})
    if(session?.user?.id) return(session.user.id)
    else return(null)
}

bodyParser 似乎与此方法冲突,因为当我将路线更改为

server.use('/user', userBasicRoutes)
时,它又开始工作了。我还尝试将此方法放在另一条路线中,其中我没有使用 bodyParser 并且它有效。

但是一旦我使用 bodyParser 并在用户登录之前调用此方法,我就会收到上述错误。如果用户已经登录,我会得到会话并且没有错误。我尝试将我的方法包装在 try/catch 块中,希望返回 null,但错误仍然显示。当用户使用 bodyparser 注销

const session=await getSession({req:request})
时执行此行后,它会抛出错误

有人知道为什么 bodyParser 在注销时会抛弃我的身份验证方法吗?我可以将 bodyparsed 请求与原始请求一起发送到我的控制器,以便我可以在身份验证方法中使用原始请求,并将解析后的请求用于 request.body 数据吗?

node.js express model-view-controller next.js13 express-validator
1个回答
0
投票

发生这种情况的原因可能是 bodyParser.json() 与 getSession 函数的交互方式,尤其是当用户未登录时。您可以尝试修改 getUserID 函数以在尝试访问 req.body 之前检查是否存在会议。如果请求有正文(由于 bodyParser.json()),则尝试获取会话。否则,处理无法获取Session的情况。像这样的东西可能会起作用,

const { getSession } = require("next-auth/react")

exports.getUserID = async (request, result, next) => {
  try {
    // Check if the request has a body before attempting to get the session
    const session = request.body ? await getSession({ req: request }) : null

    if (session?.user?.id) {
      return session.user.id
    } else {
      return null
    }
  } catch (error) {
    // ... Here handle any errors that might occur when getting the session
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.