当前位置: 首页 > 知识库问答 >
问题:

next.js - 在 nextjs 14中间件引入next-auth的时候出现报错?

双元魁
2024-06-20

小弟是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?

共有2个答案

冀啸
2024-06-20

首先你要知道有个平台叫 Vercel,是目前很流行的一个开发平台,DX 很好,很受欢迎,Next.js 就是他们家主导开发的。

他们平台提供一个精简版 JS 运行时,叫做“Edge Runtime”,精简的目的自然是增效降本,但是精简的过程中也会损失一些内建支持,比如 crypto。所以这个提示的意思就是:在他们家的 Edge 运行时上,不支持 crypto,你的代码(依赖)里要使用这个库,所以不行。

解决方案我不太确定,有几个思路:

  1. 你的代码要跑在 Vercel 上。那你就找到用 crypto 的库,把它替换掉。耐心找找,用一下文本搜索,肯定找得到
  2. 你的代码跟 Vercel 无关,或者你不想用 Edge 运行时,那就选择别的运行时:

    export const config = {  runtime: 'nodejs',};

Choose a runtime (optional)

小牛23046
2024-06-20

针对你遇到的报错信息 "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 环境有所不同。

要解决这个问题,你可以尝试以下步骤:

  1. 确认环境
    确保你了解 Next.js 中间件是在什么环境中执行的。如果你的中间件使用了只能在 Node.js 环境中运行的 crypto 模块功能,这可能会导致问题。
  2. 升级 next-auth
    如果你使用的是 next-auth 的 beta 版本,尝试升级到稳定版本或最新的 beta 版本,看看是否解决了问题。有时候,库的早期版本可能包含与最新框架版本不兼容的bug。
  3. 检查依赖
    审查你的项目依赖,查看是否有其他库依赖于 crypto 模块,并在 Edge Runtime 环境中运行。如果找到了这样的库,尝试查找是否有替代方案,或者检查该库的文档和 issue 跟踪器,看看是否有关于在 Edge Runtime 中使用的指导。
  4. 代码适配
    如果可能的话,重构你的代码,以避免在 Edge Runtime 中使用 crypto 模块。这可能需要将敏感操作(如密码哈希)移动到服务端渲染(SSR)页面或 API 路由中,这些环境支持完整的 Node.js API。
  5. 更换数据库驱动
    虽然更换数据库驱动(如从 MongoDB 的 native driver 切换到 Mongoose)可能不是直接解决 crypto 模块问题的办法,但如果 Mongoose 提供了更好的兼容性或抽象层,它可能有助于避免类似的问题。不过,在切换到新驱动之前,请确保它适用于你的用例,并且兼容 Edge Runtime。
  6. 联系 Vercel 支持
    如果问题仍然存在,并且你认为这可能是 Vercel Edge Runtime 的一个 bug 或限制,你可以联系 Vercel 的官方支持寻求帮助。
  7. 使用 API 路由
    如果你需要在 Next.js 应用中执行需要完整 Node.js 环境的操作(如使用 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:如果你需要了解任何文件,请在下面给我留言,我会添加这些文件。