Render.com部署Node.js后端遇node:fs模块缺失错误,求解决方案
Node.js后端部署Render.com时出现
node:fs模块找不到的问题 问题背景
部署基于React的Web应用,先部署Node.js+MongoDB后端,前端用JavaScript开发。在Render.com设置构建命令npm install、运行命令npm start,部署时报错,提示找不到node:fs模块,调用栈指向openai依赖。
错误日志
Sep 28 03:47:04 PM internal/modules/cjs/loader.js:888 Sep 28 03:47:04 PM throw err; Sep 28 03:47:04 PM ^ Sep 28 03:47:04 PM Sep 28 03:47:04 PM Error: Cannot find module 'node:fs' Sep 28 03:47:04 PM Require stack: Sep 28 03:47:04 PM - /opt/render/project/src/Tuba-Backend/node_modules/openai/_shims/node-runtime.js Sep 28 03:47:04 PM - /opt/render/project/src/Tuba-Backend/node_modules/openai/_shims/auto/runtime-node.js Sep 28 03:47:04 PM - /opt/render/project/src/Tuba-Backend/node_modules/openai/_shims/index.js Sep 28 03:47:04 PM - /opt/render/project/src/Tuba-Backend/node_modules/openai/core.js Sep 28 03:47:04 PM - /opt/render/project/src/Tuba-Backend/node_modules/openai/index.js Sep 28 03:47:04 PM - /opt/render/project/src/Tuba-Backend/routes/posts.js Sep 28 03:47:04 PM - /opt/render/project/src/Tuba-Backend/server.js Sep 28 03:47:04 PM at Function.Module._resolveFilename (internal/modules/cjs/loader.js:885:15) Sep 28 03:47:04 PM at Function.Module._load (internal/modules/cjs/loader.js:730:27) Sep 28 03:47:04 PM at Module.require (internal/modules/cjs/loader.js:957:19) Sep 28 03:47:04 PM at require (internal/modules/cjs/helpers.js:88:18) Sep 28 03:47:04 PM at Object.<anonymous> (/opt/render/project/src/Tuba-Backend/node_modules/openai/_shims/node-runtime.js:37:19) Sep 28 03:47:04 PM at Module._compile (internal/modules/cjs/loader.js:1068:30) Sep 28 03:47:04 PM at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10) Sep 28 03:47:04 PM at Module.load (internal/modules/cjs/loader.js:933:32) Sep 28 03:47:04 PM at Function.Module._load (internal/modules/cjs/loader.js:774:14) Sep 28 03:47:04 PM at Module.require (internal/modules/cjs/loader.js:957:19) { Sep 28 03:47:04 PM code: 'MODULE_NOT_FOUND', Sep 28 03:47:04 PM requireStack: [ Sep 28 03:47:04 PM '/opt/render/project/src/Tuba-Backend/node_modules/openai/_shims/node-runtime.js', Sep 28 03:47:04 PM '/opt/render/project/src/Tuba-Backend/node_modules/openai/_shims/auto/runtime-node.js', Sep 28 03:47:04 PM '/opt/render/project/src/Tuba-Backend/node_modules/openai/_shims/index.js', Sep 28 03:47:04 PM '/opt/render/project/src/Tuba-Backend/node_modules/openai/core.js', Sep 28 03:47:04 PM '/opt/render/project/src/Tuba-Backend/node_modules/openai/index.js', Sep 28 03:47:04 PM '/opt/render/project/src/Tuba-Backend/routes/posts.js', Sep 28 03:47:04 PM '/opt/render/project/src/Tuba-Backend/server.js' Sep 28 03:47:04 PM ] Sep 28 03:47:04 PM }
后端package.json
{ "name": "server.js", "version": "1.0.0", "main": "server.js", "scripts": { "dev": "nodemon server.js", "start": "nodemon server.js", "build": "npm i" }, "author": "", "license": "ISC", "description": "", "dependencies": { "all": "^0.0.0", "bcrypt": "^5.1.0", "express": "^4.18.2", "helmet": "^7.0.0", "mongoose": "^7.2.4", "multer": "^1.4.5-lts.1", "nodemailer": "^6.9.4", "nodemon": "^2.0.22", "openai": "^4.10.0" } }
server.js代码
const express = require("express"); const fs = require('fs'); const app = express(); const postRoute = require("./routes/posts") const authRoute = require("./routes/auth") const userRoute = require("./routes/users") const teamRoute = require("./routes/team") const AIRoute = require("./routes/AI") const uploadRoute = require("./routes/upload") const otpRoute = require("./routes/otp") const path = require("path") const PORT = 5000; const mongoose = require("mongoose"); // import dotenv file to protect my password from third party require("dotenv").config(); // connecting to database // protecting password from being revealed to third party mongoose.connect(process.env.MONGOURL) .then(()=>{console.log("connected");}) .catch((err)=>{console.log(err);}) // identify whether it is connected if it is connected it will return "connected" // if not then it will return error // midle-ware set up app.use("/images", express.static(path.join(__dirname,"public/images"))) app.use(express.json()) app.use("/api/users", userRoute); app.use("/api/auth", authRoute); app.use("/api/posts", postRoute); app.use("/api/team", teamRoute); app.use("/api/AI", AIRoute); app.use("/api/upload", uploadRoute); app.use("/api/otp", otpRoute); // app.get("/", (req,res) => { // res.send(" can u hear me? ") // }) app.listen(PORT, ()=> console.log("server is activated"));
错误原因分析
- Node.js版本不兼容:
node:fs这种带node:前缀的模块导入方式是Node.js 16.0.0及以上版本才支持的特性。从错误日志里的internal/modules/cjs/loader.js版本来看,Render.com当前使用的Node.js版本低于16.0.0,无法识别这种导入语法。 - openai依赖要求:使用的
openai@4.10.0版本内部使用了node:fs这类新语法,对Node.js版本有最低要求(通常是16.x及以上)。
解决办法
方法1:指定Render.com使用的Node.js版本
在后端项目根目录创建.nvmrc文件,写入需要的Node.js版本号(比如18或20):
18
或者直接在package.json中添加engines字段:
{ "engines": { "node": ">=16.0.0" } }
Render.com会自动读取这个配置,使用对应版本的Node.js运行项目。
方法2:降低openai版本到兼容旧Node.js的版本
如果不想升级Node.js,可以将openai版本降级到v3.x系列,v3版本不使用node:前缀的模块导入语法,兼容更低版本的Node.js。修改package.json中的依赖:
"openai": "^3.3.0"
然后重新运行npm install,提交修改后重新部署。
方法3:修正启动命令(可选)
start命令使用nodemon是开发环境工具,生产环境建议直接用node server.js,避免不必要的依赖问题:
"scripts": { "dev": "nodemon server.js", "start": "node server.js", "build": "npm install" }
内容的提问来源于stack exchange,提问作者tuva
相关产品推荐
相关产品推荐

