我有我的...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 数据吗?
发生这种情况的原因可能是 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
}
}