小弟是nextjs新手,用的nextjs最新版本14,然后想要实现私有路由,于是在next中间件中引入了next-auth/@beta.
另外,我的auth配置是使用的CredentialProvider,也就是从nextjs服务器用最新的route handler直接链接数据库,去获取用户信息并鉴权。数据库链接用的mongoDB的native driver.
报错信息:
The edge runtime does not support Node.js 'crypto' module
我看到有人遇到跟我类似的问题,并在next-auth官方repo下面问了问题,得到解答是这个跟next-auth无关,是另外一个og库,但是我不太知道这个库是具体从哪里来的。
https://github.com/nextauthjs/next-auth/issues/10540
我能明白这个报错肯定是来自于某个库,用的这个crypto在nextjs中间件edge环境下运行不了。但是我不知道这个东西具体问题是出在哪个库了,也不知道这个怎么解决。
所以来这里碰碰运气,希望大佬能帮忙解答,或者给我个思路。我正在考虑换掉mongoDB native driver?换成mongoose?
首先你要知道有个平台叫 Vercel,是目前很流行的一个开发平台,DX 很好,很受欢迎,Next.js 就是他们家主导开发的。
他们平台提供一个精简版 JS 运行时,叫做“Edge Runtime”,精简的目的自然是增效降本,但是精简的过程中也会损失一些内建支持,比如 crypto
。所以这个提示的意思就是:在他们家的 Edge 运行时上,不支持 crypto
,你的代码(依赖)里要使用这个库,所以不行。
解决方案我不太确定,有几个思路:
crypto
的库,把它替换掉。耐心找找,用一下文本搜索,肯定找得到你的代码跟 Vercel 无关,或者你不想用 Edge 运行时,那就选择别的运行时:
export const config = { runtime: 'nodejs',};
Choose a runtime (optional)
针对你遇到的报错信息 "The edge runtime does not support Node.js 'crypto' module",这个问题通常发生在 Next.js 的 Edge Runtime 环境中,该环境不支持完整的 Node.js API,包括某些 crypto
模块的功能。Next.js 14 引入了中间件支持,并可能通过 Vercel Edge Functions 来执行这些中间件,这些函数运行在 Edge Runtime 环境中,其环境与完整的 Node.js 环境有所不同。
要解决这个问题,你可以尝试以下步骤:
crypto
模块功能,这可能会导致问题。next-auth
的 beta 版本,尝试升级到稳定版本或最新的 beta 版本,看看是否解决了问题。有时候,库的早期版本可能包含与最新框架版本不兼容的bug。crypto
模块,并在 Edge Runtime 环境中运行。如果找到了这样的库,尝试查找是否有替代方案,或者检查该库的文档和 issue 跟踪器,看看是否有关于在 Edge Runtime 中使用的指导。crypto
模块。这可能需要将敏感操作(如密码哈希)移动到服务端渲染(SSR)页面或 API 路由中,这些环境支持完整的 Node.js API。crypto
模块问题的办法,但如果 Mongoose 提供了更好的兼容性或抽象层,它可能有助于避免类似的问题。不过,在切换到新驱动之前,请确保它适用于你的用例,并且兼容 Edge Runtime。crypto
模块),考虑将这些操作放在 API 路由中,而不是中间件中。API 路由运行在服务器端,支持完整的 Node.js API。请注意,没有特定的答案可以直接告诉你是否需要更换数据库驱动,因为这取决于你的具体实现和 crypto
模块的使用方式。通常,最佳实践是避免在 Edge Functions 中使用 Node.js 的核心模块,特别是那些可能不受支持的模块。如果可能,重构代码以在服务器端执行这些操作通常是最可靠的方法。
next.js创建的新项目中引入antd时出现SyntaxError: Cannot use import statement outside a module 我在命令行中用以下命令创建了next.js的新项目,以及一些选择 当我运行这个项目的时候,是没有问题的,结果如下 可是当我尝试引入一些库,比如antd的时候,当我再次运行的时候,就出现了问题 令我感到奇怪的是,当我使用应用路由而不是页面路
HarmonyOS Next中如何在arkts中格式化时间戳? 比如将1611081385000格式化为:2021-01-20 02:36:25
我在告诉java时出错了。lang.ClassCastException:[My extent report class name]无法强制转换到组织。testng。将TestNG XML文件作为测试套件运行时使用ITestNGListener。 我已经使用页面工厂设计技术,使用MAVEN和TestNG自动化了一个网页,它由6个页面类组成,对象在一个包中初始化。我还在另一个包中编写了扩展报告侦听器
问题内容: 根据运行时错误消息,异常发生在下一行; 是具有构造函数和重载构造函数的类,其中包含有关数据库中每种病毒的特定信息,例如; 字符串vName 字符串vDefinition 重载 具有标记化定义的数组(以xLength组分隔) 具有LCS令牌的阵列 有等级浮动 类型的是.iterator(),如下所示: 是和ArrayList类型,用于存储病毒对象 (此时为名称和定义), 以便以后使用。
输入输出中间件可以完全代替 Hprose 过滤器。使用输入输出中间件还是使用 Hprose 过滤器完全看开发者喜好。 输入输出中间件的形式为: func( request []byte, context Context, next NextFilterHandler) (response []byte, err error) { ... response,
我在使用Laravel 5.2框架的中间件组时遇到了一些问题。 我的路线。php文件是: 我在这里使用laravel默认登录/注册身份验证。使用php-artisan-make:auth命令。我想给用户限制一些,例如路由组。所以 如何限制用户的类别路由组? 如果我使用Route::组(['中间件'= 谢谢 N、 B:如果你需要了解任何文件,请在下面给我留言,我会添加这些文件。