I’m using convex auth
with nextjs
to authenticate in my app, the authentication was working fine, but then I implemented the next-intl, and now I’m getting the following error when logging in:
<code>Unable to find `next-intl` locale because the middleware didn't run on this request. See https://next-intl-docs.vercel.app/docs/routing/middleware#unable-to-find-locale. The `notFound()` function will be called as a result.
POST /api/auth 404 in 46ms
</code>
<code>Unable to find `next-intl` locale because the middleware didn't run on this request. See https://next-intl-docs.vercel.app/docs/routing/middleware#unable-to-find-locale. The `notFound()` function will be called as a result.
POST /api/auth 404 in 46ms
</code>
Unable to find `next-intl` locale because the middleware didn't run on this request. See https://next-intl-docs.vercel.app/docs/routing/middleware#unable-to-find-locale. The `notFound()` function will be called as a result.
POST /api/auth 404 in 46ms
This is my middleware.ts:
<code>import createIntlMiddleware from "next-intl/middleware";
import {
convexAuthNextjsMiddleware,
createRouteMatcher,
isAuthenticatedNextjs,
nextjsMiddlewareRedirect,
} from "@convex-dev/auth/nextjs/server";
import { routing } from "./i18n/routing";
const isPublicPage = createRouteMatcher(["/auth"]);
const intlMiddleware = createIntlMiddleware(routing);
export default async function middleware(request: any) {
// First, handle internationalization routing
const intlResponse = await intlMiddleware(request);
if (intlResponse) {
return intlResponse;
}
// Then, handle authentication routing
return convexAuthNextjsMiddleware((request: any) => {
if (!isPublicPage(request) && !isAuthenticatedNextjs()) {
return nextjsMiddlewareRedirect(request, "/auth");
}
if (isPublicPage(request) && isAuthenticatedNextjs()) {
return nextjsMiddlewareRedirect(request, "/");
}
})(request);
}
export const config = {
matcher: ["/((?!api|_next|.*\..*).*)"],
};
</code>
<code>import createIntlMiddleware from "next-intl/middleware";
import {
convexAuthNextjsMiddleware,
createRouteMatcher,
isAuthenticatedNextjs,
nextjsMiddlewareRedirect,
} from "@convex-dev/auth/nextjs/server";
import { routing } from "./i18n/routing";
const isPublicPage = createRouteMatcher(["/auth"]);
const intlMiddleware = createIntlMiddleware(routing);
export default async function middleware(request: any) {
// First, handle internationalization routing
const intlResponse = await intlMiddleware(request);
if (intlResponse) {
return intlResponse;
}
// Then, handle authentication routing
return convexAuthNextjsMiddleware((request: any) => {
if (!isPublicPage(request) && !isAuthenticatedNextjs()) {
return nextjsMiddlewareRedirect(request, "/auth");
}
if (isPublicPage(request) && isAuthenticatedNextjs()) {
return nextjsMiddlewareRedirect(request, "/");
}
})(request);
}
export const config = {
matcher: ["/((?!api|_next|.*\..*).*)"],
};
</code>
import createIntlMiddleware from "next-intl/middleware";
import {
convexAuthNextjsMiddleware,
createRouteMatcher,
isAuthenticatedNextjs,
nextjsMiddlewareRedirect,
} from "@convex-dev/auth/nextjs/server";
import { routing } from "./i18n/routing";
const isPublicPage = createRouteMatcher(["/auth"]);
const intlMiddleware = createIntlMiddleware(routing);
export default async function middleware(request: any) {
// First, handle internationalization routing
const intlResponse = await intlMiddleware(request);
if (intlResponse) {
return intlResponse;
}
// Then, handle authentication routing
return convexAuthNextjsMiddleware((request: any) => {
if (!isPublicPage(request) && !isAuthenticatedNextjs()) {
return nextjsMiddlewareRedirect(request, "/auth");
}
if (isPublicPage(request) && isAuthenticatedNextjs()) {
return nextjsMiddlewareRedirect(request, "/");
}
})(request);
}
export const config = {
matcher: ["/((?!api|_next|.*\..*).*)"],
};
<code> "dependencies": {
"@auth/core": "^0.34.2",
"@convex-dev/auth": "^0.0.61",
"@radix-ui/react-avatar": "^1.1.0",
"@radix-ui/react-dialog": "^1.1.1",
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-popover": "^1.1.1",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cmdk": "1.0.0",
"convex": "^1.15.0",
"date-fns": "^3.6.0",
"emoji-picker-react": "^4.12.0",
"jotai": "^2.9.3",
"lucide-react": "^0.437.0",
"next": "^14.2.9",
"next-intl": "^3.19.1",
"next-themes": "^0.3.0",
"nuqs": "^1.19.1",
"quill": "^2.0.2",
"react": "^18",
"react-dom": "^18",
"react-icons": "^5.3.0",
"react-resizable-panels": "^2.1.2",
"react-use": "^17.5.1",
"react-verification-input": "^4.1.2",
"sonner": "^1.5.0",
"tailwind-merge": "^2.5.2",
"tailwindcss-animate": "^1.0.7"
},
</code>
<code> "dependencies": {
"@auth/core": "^0.34.2",
"@convex-dev/auth": "^0.0.61",
"@radix-ui/react-avatar": "^1.1.0",
"@radix-ui/react-dialog": "^1.1.1",
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-popover": "^1.1.1",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cmdk": "1.0.0",
"convex": "^1.15.0",
"date-fns": "^3.6.0",
"emoji-picker-react": "^4.12.0",
"jotai": "^2.9.3",
"lucide-react": "^0.437.0",
"next": "^14.2.9",
"next-intl": "^3.19.1",
"next-themes": "^0.3.0",
"nuqs": "^1.19.1",
"quill": "^2.0.2",
"react": "^18",
"react-dom": "^18",
"react-icons": "^5.3.0",
"react-resizable-panels": "^2.1.2",
"react-use": "^17.5.1",
"react-verification-input": "^4.1.2",
"sonner": "^1.5.0",
"tailwind-merge": "^2.5.2",
"tailwindcss-animate": "^1.0.7"
},
</code>
"dependencies": {
"@auth/core": "^0.34.2",
"@convex-dev/auth": "^0.0.61",
"@radix-ui/react-avatar": "^1.1.0",
"@radix-ui/react-dialog": "^1.1.1",
"@radix-ui/react-dropdown-menu": "^2.1.1",
"@radix-ui/react-popover": "^1.1.1",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-tooltip": "^1.1.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"cmdk": "1.0.0",
"convex": "^1.15.0",
"date-fns": "^3.6.0",
"emoji-picker-react": "^4.12.0",
"jotai": "^2.9.3",
"lucide-react": "^0.437.0",
"next": "^14.2.9",
"next-intl": "^3.19.1",
"next-themes": "^0.3.0",
"nuqs": "^1.19.1",
"quill": "^2.0.2",
"react": "^18",
"react-dom": "^18",
"react-icons": "^5.3.0",
"react-resizable-panels": "^2.1.2",
"react-use": "^17.5.1",
"react-verification-input": "^4.1.2",
"sonner": "^1.5.0",
"tailwind-merge": "^2.5.2",
"tailwindcss-animate": "^1.0.7"
},
The next-intl is working, just the convex auth that isnt anymore.
Yes, the middleware
is in the src
folder.
I’ve tried multiple middleware
configuration on the matcher
option, but nothing works