You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js从12.x自动升级到16.x后调用.NET Web服务时出现ERR_REQUIRE_ESM错误

Node.js从12.x自动升级到16.x后调用.NET Web服务时出现ERR_REQUIRE_ESM错误

嘿,这个问题我太熟了!Node.js 16对ES模块(ESM)和CommonJS(CJS)的边界把控比12.x严格多了,你遇到的错误本质是:dateformat这个包在新版本里改成了纯ES模块,但你的依赖ws.js里的security.js还在用传统的require()去加载它,这就触发了Node.js的兼容性限制。

给你几个可行的解决办法,按优先级排序:

  • 修改security.js的引入方式(官方推荐)
    把原来的同步require改成动态import(),这是Node.js允许在CommonJS模块里加载ES模块的唯一合法方式。如果你的代码是异步环境,直接用await就行:

    // 替换原来的 const dateformat = require('dateformat');
    async function yourSecurityLogic() {
      const { default: dateformat } = await import('dateformat');
      // 这里继续写原来用dateformat的代码
    }
    

    如果代码没法改成异步,也可以用Promise回调:

    import('dateformat').then(({ default: dateformat }) => {
      // 在这里执行依赖dateformat的逻辑
    });
    

    注意要解构出default,因为ES模块的默认导出在动态import里是挂在default属性上的。

  • 降级dateformat到兼容CommonJS的版本
    如果你暂时不想改代码,可以安装dateformat的旧版本——比如3.0.3,这个版本还是CommonJS格式的,不会触发ESM错误:

    npm install dateformat@3.0.3 --save
    

    不过这只是临时方案,长远来看还是建议适配ES模块的加载方式。

  • 检查并升级依赖包
    看看ws.js和WCF.js有没有更新到修复了这个ESM兼容性问题的版本,直接升级可能一步到位:

    npm update ws.js wcf.js
    

其实这个问题是Node.js版本升级后很典型的模块格式冲突问题,16.x开始对ESM的规范执行更严格,很多老包要么升级成ESM,要么就需要调用方用动态import适配,选哪个方案看你项目的维护节奏啦!

备注:内容来源于stack exchange,提问作者Jason Kilhoffer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:04:38