Docker环境下init-db.js脚本出现ReferenceError: require is not defined错误的求助
require is not defined的问题 看起来你遇到的问题主要和Node.js的模块系统配置以及Dockerfile中的文件复制路径有关,我来一步步帮你排查解决:
1. 修正Dockerfile中的文件复制路径
你的Dockerfile里有个容易忽略的错误:当你设置了WORKDIR /app之后,所有后续命令都是在/app目录下执行的,但你复制package.json和requirements.txt时用了./app作为目标路径,这会把文件放到/app/app/子目录里,导致npm install和pip install找不到对应的配置文件。
修改Dockerfile中的这两行:
# 原错误写法 COPY requirements.txt ./app COPY package.json ./app # 改成下面的正确写法 COPY requirements.txt ./ COPY package.json ./
2. 调整Node.js模块系统配置
require is not defined的核心原因是脚本的模块系统模式不匹配,Node.js有两种模块模式:CommonJS(用require)和ES模块(用import),你需要确保脚本和package.json的配置一致:
选项A:继续使用CommonJS(保留require)
检查你的package.json,确保里面没有"type": "module"这一行。如果之前添加过,直接删除它,这样Node.js会默认使用CommonJS模式,require就能正常工作了。
选项B:切换到ES模块(改用import)
如果你想使用import语法,需要在package.json中添加"type": "module"字段:
{ "name": "your-app-name", "type": "module", "dependencies": { "papaparse": "^5.4.1", "request": "^2.88.2" } }
然后修改你的init-db.js中的导入语句:
import papa from "papaparse"; import request from "request"; // 剩下的代码保持不变 const options = {/* options */}; const dataStream = request.get("https://example.com/myfile.csv"); const parseStream = papa.parse(papa.NODE_STREAM_INPUT, options); dataStream.pipe(parseStream); let data = []; parseStream.on("data", chunk => { data.push(chunk); }); parseStream.on("finish", () => { // Doing something with the data. });
3. 确保用Node.js正确运行脚本
最后,确认你在Docker中是用node命令来执行脚本的,比如可以在Dockerfile末尾添加启动命令:
CMD ["node", "init-db.js"]
或者进入容器后手动执行:
node init-db.js
另外,虽然你提到request库已废弃,但只要它能满足你的需求就没问题,如果后续遇到问题,也可以考虑替换成axios或node-fetch这类维护中的库。
内容的提问来源于stack exchange,提问作者Incepnizer

