nextjs14 with next-connect not working
TypeError: res.setHeader is not a function
at strategy.redirect (webpack-internal:///(rsc)/./node_modules/passport/lib/middleware/authenticate.js:322:21)
at stored (webpack-internal:///(rsc)/./node_modules/passport-oauth2/lib/strategy.js:285:22)
at NullStore.store (webpack-internal:///(rsc)/./node_modules/passport-oauth2/lib/state/null.js:3:5)
at OAuth2Strategy.authenticate (webpack-internal:///(rsc)/./node_modules/passport-oauth2/lib/strategy.js:296:38)
at attempt (webpack-internal:///(rsc)/./node_modules/passport/lib/middleware/authenticate.js:353:22)
at authenticate (webpack-internal:///(rsc)/./node_modules/passport/lib/middleware/authenticate.js:354:11)
at eval (webpack-internal:///(rsc)/./app/api/auth/[provider]/route.js:55:11)
at new Promise (
`import passport from "passport"; import { Strategy as GitHubOAuth2Strategy } from "passport-github"; import { OAuth2Strategy as GoogleOAuth2Strategy } from "passport-google-oauth";
//import api from "@/api";
const SUPPORTED_PROVIDERS = ["google", "github"]; import { NextResponse } from "next/server";
import { createEdgeRouter } from "next-connect";
passport.use( new GitHubOAuth2Strategy( { clientID: process.env.GITHUB_CLIENT_ID ?? "", clientSecret: process.env.GITHUB_CLIENT_SECRET ?? "", callbackURL: process.env.GITHUB_CALLBACK_URL ?? "", scope: ["user:email"], }, (accessToken, _, profile, cb) => { return cb(null, { accessToken, profile }); } ) ); passport.use( new GoogleOAuth2Strategy( { clientID: process.env.GOOGLE_CLIENT_ID ?? "", clientSecret: process.env.GOOGLE_CLIENT_SECRET ?? "", callbackURL: process.env.GOOGLE_CALLBACK_URL ?? "", scope: "profile email", }, (accessToken, _, profile, cb) => { return cb(null, { accessToken, profile }); } ) );
const authenticate = (method, req, res) => new Promise((resolve, reject) => { passport.authenticate(method, { session: false }, (error, token) => { if (error) { reject(error); } else { resolve(token); } })(req, res); });
const router = createEdgeRouter();
router.use(passport.initialize()).get(async (req, res) => { const { provider } = res.params; try { const user = await authenticate(provider, req, res); return NextResponse.json({ user }); } catch (error) { console.error(error); return NextResponse.json(error.message, { status: 401 }); } });
export async function GET(req, ctx) { // Validate provider const { provider } = ctx.params;
if (typeof provider !== "string") {
return Response.json(
{
success: false,
error: "Invalid OAuth2 provider.",
},
{
status: 400,
}
);
}
if (!SUPPORTED_PROVIDERS.includes(provider)) {
return Response.json(
{
success: false,
error: ${provider} is not a supported OAuth2 provider.,
},
{
status: 400,
}
);
}
// Check if we're already logged in // const user = await api.me(req, res); // if (user.success && user?.payload) { // // If User hasn't completed account creation then redirect // if (user.payload.user?.state !== "COMPLETE") { // res.redirect("/profile"); // return; // } // res.redirect("/"); // return; // }
try { const opts = { session: false, };
return router.run(req, ctx);
//await passport.authenticate(provider, opts)(req, new NextResponse());
} catch (err) {
console.error(err);
return Response.json(
{
success: false,
error: Failed to authenticate with ${provider}. Please try again later.,
},
{
status: 500,
}
);
}
}
`
please make sure your code is properly wrapped. It's pain to read.