在自己的测试项目里想着做登录功能,看到authjs
就接到项目里去,本身就使用的drizzle
,在不配置 db adapter 的情况下运行正常,但只要配置就会报错:
1 | ⨯ Error [TypeError]: Cannot read properties of undefined (reading 'reduce') |
无法启动
步骤都是按照authjs
的教程来的:
顺带提一嘴,第二个文档里的AUTH_DRIZZLE_URL
没啥意义,用自己的环境变量就好,毕竟他自己后面也忘记用了 😀
1 | const connectionString = "postgres://postgres:postgres@localhost:5432/drizzle"; |
回归正题,最开始以为是哪里配的不对,把之前的drizzle
结构和配置都按照实例里的调整了,嗝屁了。
在想是不是npm
冲突了,就切换到了pnpm
,还是嗝屁。
又在想是不是用的supabase
的postgresql
有问题,但是发现只要把
1 | export const { handlers, signIn, signOut, auth } = NextAuth({ |
里的
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 | 3. Add optional Middleware to keep the session alive, this will update the session expiry every time its called. |
那就是这个问题了… …
把middleware.ts
删了就恢复了。
也就是配置了 db 的 adapter,因为用了 pg,pg 的 node 驱动不能在edge runtime
执行,所以报错了,之所以没有 log 是因为 middleware 的执行时间更早,还没有调到服务层面他就挂了。
再看官方其实提到了解法:
guides/edge-compatibility
试了下就恢复了,还是知识储备不够啊,第一眼不知道报错里的edge
是什么意思,我还以为是我用的浏览器(笑死,刚好测试是用 edge 测的,闹出笑话了)😂