Mat*_*sen 8 javascript next.js next-auth
在本地计算机上的终端中使用以下命令时,应用程序在生产模式下尝试在 Next.js 应用程序中使用 next-auth 登录时失败:
`纱线构建&&纱线启动`
在终端观察到的错误信息如下:
TypeError [ERR_INVALID_URL]: Invalid URL
at new NodeError (node:internal/errors:372:5)
at URL.onParseError (node:internal/url:553:9)
at new URL (node:internal/url:629:5)
at Object.redirect (/Users/name/Documents/GitHub/app/node_modules/next-auth/core/lib/default-callbacks.js:16:65)
at createCallbackUrl (/Users/name/Documents/GitHub/app/node_modules/next-auth/core/lib/callback-url.js:20:35)
at init (/Users/name/Documents/GitHub/app/node_modules/next-auth/core/init.js:132:48)
at AuthHandlerInternal (/Users/name/Documents/GitHub/app/node_modules/next-auth/core/index.js:98:28)
at AuthHandler (/Users/name/Documents/GitHub/app/node_modules/next-auth/core/index.js:335:34)
at processTicksAndRejections (node:internal/process/task_queues:96:5)
at async NextAuthHandler (/Users/name/Documents/GitHub/app/node_modules/next-auth/next/index.js:38:20) {
input: 'undefined/home',
code: 'ERR_INVALID_URL'
}
Run Code Online (Sandbox Code Playgroud)
如果我在终端中使用以下命令在开发模式下运行,则不会出现该问题:
`纱线开发`
这是我的 [...nextauth].ts 文件:
import NextAuth from "next-auth";
import type { NextAuthOptions } from "next-auth";
import GoogleProvider from "next-auth/providers/google";
import FacebookProvider from "next-auth/providers/facebook";
import EmailProvider from "next-auth/providers/email";
import { PrismaAdapter } from "@next-auth/prisma-adapter";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
export const authOptions: NextAuthOptions = {
adapter: PrismaAdapter(prisma),
providers: [
GoogleProvider({
// @ts-ignore
clientId: process.env.GOOGLE_CLIENT_ID,
// @ts-ignore
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
FacebookProvider({
// @ts-ignore
clientId: process.env.FACEBOOK_CLIENT_ID,
// @ts-ignore
clientSecret: process.env.FACEBOOK_CLIENT_SECRET,
}),
EmailProvider({
server: {
host: process.env.SMTP_HOST,
port: Number(process.env.SMTP_PORT),
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASSWORD,
},
},
from: process.env.SMTP_FROM,
}),
],
secret: process.env.NEXTAUTH_SECRET,
callbacks: {
session: async ({ session, token }) => {
if (session?.user) {
// @ts-ignore
session.user.id = token.uid;
}
return session;
},
jwt: async ({ user, token }) => {
if (user) {
token.uid = user.id;
}
return token;
},
},
session: {
strategy: "jwt",
maxAge: 30 * 24 * 60 * 60, // 30 days
// updateAge: 24 * 60 * 60, // 24 hours
},
jwt: {
secret: process.env.NEXTAUTH_SECRET,
},
};
export default NextAuth(authOptions);
Run Code Online (Sandbox Code Playgroud)
我尝试找出生产中有关错误消息的不同之处TypeError [ERR_INVALID_URL]: Invalid URL,但无法弄清楚。我没有更改任何环境变量,并且在 .env.local 中设置了以下变量:
NEXTAUTH_SECRET="SomeLongString"
Run Code Online (Sandbox Code Playgroud)
NEXTAUTH_URL="http://localhost:3000"
Run Code Online (Sandbox Code Playgroud)
根据请求添加 package.json:
{
"name": "app",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@headlessui/react": "^1.7.4",
"@heroicons/react": "^2.0.13",
"@next-auth/prisma-adapter": "^1.0.5",
"@prisma/client": "^4.7.1",
"@tailwindcss/aspect-ratio": "^0.4.2",
"@tailwindcss/typography": "^0.5.8",
"@types/node": "18.11.9",
"@types/react": "18.0.25",
"@types/react-datepicker": "^4.8.0",
"@types/react-dom": "18.0.9",
"autoprefixer": "^10.4.13",
"classnames": "^2.3.2",
"clsx": "^1.2.1",
"date-fns": "^2.29.3",
"eslint": "8.28.0",
"eslint-config-next": "13.0.4",
"framer-motion": "^7.6.7",
"graphql-request": "^5.0.0",
"next": "13.0.4",
"next-auth": "^4.18.6",
"next-seo": "^5.14.1",
"nodemailer": "^6.8.0",
"postcss": "^8.4.19",
"react": "18.2.0",
"react-datepicker": "^4.8.0",
"react-dom": "18.2.0",
"react-hook-form": "^7.40.0",
"react-hot-toast": "^2.4.0",
"react-icons": "^4.6.0",
"sass": "^1.56.1",
"swr": "^1.3.0",
"tailwindcss": "^3.2.4",
"typescript": "4.9.3"
},
"devDependencies": {
"prettier-plugin-prisma": "^4.4.0",
"prisma": "^4.7.1"
}
}
Run Code Online (Sandbox Code Playgroud)
我缺少什么?
nin*_*sau 10
我认为这是因为您在生产中使用了开发链接NEXTAUTH_URL="http://localhost:3000"。相反,请在生产中使用实时链接NEXTAUTH_URL="yourwebsite.com"。
另外,不要使用 if 语句来检查您是在开发还是在生产中,而是有 2 个.env文件 - 一个在本地,带有 localhost url,另一个在实时,带有实时 url。这可以帮助您更好地诊断问题。
更重要的是,检查以确认您的环境变量实际上可以在您的应用程序中访问。
小智 5
NEXTAUTH_URL 未定义。您需要在.env 文件中定义NEXTAUTH_URL。
NextJs内置了多种方法,允许您使用不同的环境变量,无论您是在测试、开发还是在生产中。虽然通常在生产中你只有一个 .env,因为你不想将你的秘密提交给 git。