ESM模块导入报错:请求的模块未提供envVars导出项
解决ESM模块导入系统常量的报错问题
报错信息
PS C:\xx\xx\projects\nodejs\http\processTIFF-0> node index.js file:///C:/xx/xx/projects/nodejs/http/processTIFF-0/index.js:3 import {envVars} from './SYS/EnvVars.js' ^^^^^^^ SyntaxError: The requested module './SYS/EnvVars.js' does not provide an export named 'envVars' at ModuleJob._instantiate (internal/modules/esm/module_job.js:104:21) at async ModuleJob.run (internal/modules/esm/module_job.js:149:5) at async Loader.import (internal/modules/esm/loader.js:166:24) at async Object.loadESM (internal/process/esm_loader.js:68:5) PS C:\Users\Amr.Bakri\projects\nodejs\http\processTIFF-0>
原始代码
EnvVars.js
export function define(name, value) { Object.defineProperty(exports, name, { value: value, enumerable: true, writable: false }); } define("END_POINT_HOST_JK","sf.tzt") define("END_POINT_PATH_RASTER_IN_POLYGON","/xx/api/process/polygon-3857?polygon=") define("END_POINT_PATH_RESOLUTION","&resolution=1") define("WKT_EPSG4326","POLYGON((14.302759232915124 52.037914242476376,14.301196347357946 12.03581482424235,44.306554812125416 32.03367606317161,24.308149593306208 52.03695283888638,14.302759232915124 52.037914242476376))")
index.js
import {envVars} from './SYS/EnvVars.js'
问题原因
代码混用了CommonJS的exports和ESM语法,且index.js试图导入的envVars在EnvVars.js中从未定义导出。ESM模块的exports与CommonJS的不是同一对象,用Object.defineProperty(exports, ...)无法在ESM中生成可导出的变量。
修复方案
方案一:直接导出常量对象(推荐,符合ESM规范)
修改EnvVars.js,直接定义包含所有常量的对象并导出:
export const envVars = { END_POINT_HOST_JK: "sf.tzt", END_POINT_PATH_RASTER_IN_POLYGON: "/xx/api/process/polygon-3857?polygon=", END_POINT_PATH_RESOLUTION: "&resolution=1", WKT_EPSG4326: "POLYGON((14.302759232915124 52.037914242476376,14.301196347357946 12.03581482424235,44.306554812125416 32.03367606317161,24.308149593306208 52.03695283888638,14.302759232915124 52.037914242476376))" }; // 如需常量不可修改,可冻结对象 Object.freeze(envVars);
index.js无需修改,直接使用即可:
import {envVars} from './SYS/EnvVars.js'; // 示例调用 console.log(envVars.END_POINT_HOST_JK);
方案二:保留define函数,导出统一对象
若要保留define函数逻辑,需在ESM中创建专属对象存储常量:
const envVars = {}; export function define(name, value) { Object.defineProperty(envVars, name, { value: value, enumerable: true, writable: false }); } define("END_POINT_HOST_JK","sf.tzt") define("END_POINT_PATH_RASTER_IN_POLYGON","/xx/api/process/polygon-3857?polygon=") define("END_POINT_PATH_RESOLUTION","&resolution=1") define("WKT_EPSG4326","POLYGON((14.302759232915124 52.037914242476376,14.301196347357946 12.03581482424235,44.306554812125416 32.03367606317161,24.308149593306208 52.03695283888638,14.302759232915124 52.037914242476376))"); export { envVars };
index.js导入代码保持不变即可正常使用。
方案三:命名导出单个常量
若不需要统一对象,可直接为每个常量做命名导出:
export const END_POINT_HOST_JK = "sf.tzt"; export const END_POINT_PATH_RASTER_IN_POLYGON = "/xx/api/process/polygon-3857?polygon="; export const END_POINT_PATH_RESOLUTION = "&resolution=1"; export const WKT_EPSG4326 = "POLYGON((14.302759232915124 52.037914242476376,14.301196347357946 12.03581482424235,44.306554812125416 32.03367606317161,24.308149593306208 52.03695283888638,14.302759232915124 52.037914242476376))";
此时index.js可按需导入:
// 按需导入指定常量 import { END_POINT_HOST_JK, WKT_EPSG4326 } from './SYS/EnvVars.js'; // 或全部导入为一个对象 import * as envVars from './SYS/EnvVars.js';
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

