Next.js使用auth.js+dirzzle+postgresql报错分析

在自己的测试项目里想着做登录功能,看到authjs就接到项目里去,本身就使用的drizzle,在不配置 db adapter 的情况下运行正常,但只要配置就会报错:

1
2
3
4
5
6
7
8
⨯ Error [TypeError]: Cannot read properties of undefined (reading 'reduce')
at <unknown> (.next\server\edge\chunks\edge-wrapper_c7ecd8c0.js:709:27)
at runModuleExecutionHooks (.next\server\edge\chunks\edge-wrapper_c7ecd8c0.js:755:9)
at instantiateModule (.next\server\edge\chunks\edge-wrapper_c7ecd8c0.js:707:9)
at getOrInstantiateModuleFromParent (.next\server\edge\chunks\edge-wrapper_c7ecd8c0.js:640:12)
at esmImport (.next\server\edge\chunks\edge-wrapper_c7ecd8c0.js:143:20)
at [project]/src/db/db.ts [middleware-edge] (ecmascript) (.next\server\edge\chunks\[root of the server]__a687996d._.js:28:218)
at <unknown> (.next\server\edge\chunks\edge-wrapper_c7ecd8c0.js:709:27)

无法启动

步骤都是按照authjs的教程来的:

顺带提一嘴,第二个文档里的AUTH_DRIZZLE_URL没啥意义,用自己的环境变量就好,毕竟他自己后面也忘记用了 😀

1
2
3
4
const connectionString = "postgres://postgres:postgres@localhost:5432/drizzle";
const pool = postgres(connectionString, { max: 1 });

export const db = drizzle(pool);

回归正题,最开始以为是哪里配的不对,把之前的drizzle结构和配置都按照实例里的调整了,嗝屁了。
在想是不是npm冲突了,就切换到了pnpm,还是嗝屁。
又在想是不是用的supabasepostgresql有问题,但是发现只要把

1
2
3
4
export const { handlers, signIn, signOut, auth } = NextAuth({
adapter: DrizzleAdapter(db),
providers: [GitHub],
});

里的

1
adapter: DrizzleAdapter(db);

去掉就又可以了。

那问题看着还是authjs,打了一些 console log,但是发现报错的时候根本就不打 log,这个又很奇怪。

就在那不停试,不停找问题,node_modules删了好几次,切分支回滚试了好几下,期间发现drizzle还不能 pull 和 push 了,一查发现了其他问题(与本文无关了):[BUG]:drizzle-kit pull shown Error.

总之就是一头雾水,太晚了就洗洗睡了。

今天起来在试了下还是一样,但是仔细看了下报错,发现是 edge 部分。

那什么是 edge 呢,让大模型解释了下:

Edge Runtime 是一个轻量级的 JavaScript 运行时环境,它被设计用来在靠近用户的边缘服务器上执行代码。在 Next.js 中,你可以选择在 Edge Runtime 中运行你的 middleware,以获得更低的延迟和更高的性能。 Edge Runtime 和 Node.js 不是完全兼容的。Edge Runtime 更加轻量级,专注于高性能和低延迟,因此它不支持 Node.js 的所有功能。在将代码部署到 Edge Runtime 之前,你需要仔细评估代码的兼容性,并采取必要的措施来解决兼容性问题。

emmmm,的确按照教程里的用了 middleware:

1
2
3
4
3. Add optional Middleware to keep the session alive, this will update the session expiry every time its called.
./middleware.ts

export { auth as middleware } from "@/auth"

那就是这个问题了… …

middleware.ts删了就恢复了。
也就是配置了 db 的 adapter,因为用了 pg,pg 的 node 驱动不能在edge runtime执行,所以报错了,之所以没有 log 是因为 middleware 的执行时间更早,还没有调到服务层面他就挂了。

再看官方其实提到了解法:
guides/edge-compatibility

试了下就恢复了,还是知识储备不够啊,第一眼不知道报错里的edge是什么意思,我还以为是我用的浏览器(笑死,刚好测试是用 edge 测的,闹出笑话了)😂