Heroku生产环境下Node.js+TypeScript找不到connect-mongodb-session类型
问题:Node.js + TypeScript 项目部署Heroku构建失败
使用Node.js搭配TypeScript开发项目,部署在Heroku平台,开发环境运行正常,但生产环境构建失败,核心错误为:
- 找不到
connect-mongodb-session和passport-facebook的类型声明文件 passport.ts中done参数隐式为any类型
构建日志
-----> Installing dependencies Installing node modules (package.json) added 323 packages, and audited 324 packages in 13s 24 packages are looking for funding run `npm fund` for details found 0 vulnerabilities npm notice npm notice New major version of npm available! 9.5.1 -> 10.0.0 npm notice Changelog: <https://github.com/npm/cli/releases/tag/v10.0.0> npm notice Run `npm install -g npm@10.0.0` to update! npm notice -----> Build Running build > server@1.0.0 build > npm install && npm run build-dev up to date, audited 320 packages in 621ms 24 packages are looking for funding run `npm fund` for details found 0 vulnerabilities > server@1.0.0 build-dev > npx tsc src/app.ts(10,26): error TS7016: Could not find a declaration file for module 'connect-mongodb-session'. '/tmp/build_78f240a8/node_modules/connect-mongodb-session/index.js' implicitly has an 'any' type. Try `npm i --save-dev @types/connect-mongodb-session` if it exists or add a new declaration (.d.ts) file containing `declare module 'connect-mongodb-session';` src/passport/passport.ts(3,46): error TS7016: Could not find a declaration file for module 'passport-facebook'. '/tmp/build_78f240a8/node_modules/passport-facebook/lib/index.js' implicitly has an 'any' type. Try `npm i --save-dev @types/passport-facebook` if it exists or add a new declaration (.d.ts) file containing `declare module 'passport-facebook';` src/passport/passport.ts(63,69): error TS7006: Parameter 'done' implicitly has an 'any' type. -----> Build failed We're sorry this build is failing! You can troubleshoot common issues here: https://devcenter.heroku.com/articles/troubleshooting-node-deploys If you're stuck, please submit a ticket so we can help: https://help.heroku.com/ Love, Heroku ! Push rejected, failed to compile Node.js app. ! Push failed
app.ts 会话配置代码
import MongoDBStore from "connect-mongodb-session"; const mongoStore = MongoDBStore(session); import { mongoURI } from './database/connection'; import ConnectMongoDBSession from 'connect-mongodb-session'; const store = new mongoStore({ collection: "sessions", uri: mongoURI, expires: 1000, }) as ConnectMongoDBSession.MongoDBStore; app.use(cors({ origin: getProductionURL(), credentials: true})); app.use(cookieParser()); app.use(express.json()); app.use(session({ secret: 'secretcode', saveUninitialized: false, resave: false, store: store, cookie: { sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax', maxAge: 48 * 60 * 60 * 1000, // 48 hours secure: process.env.NODE_ENV === 'production', httpOnly: true } })); app.use(passport.initialize()); app.use(passport.session());
tsconfig.json 配置
{ "compilerOptions": { "target": "ES6", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] }
package.json 依赖配置
"devDependencies": { "@types/connect-mongodb-session": "^2.4.5", "@types/express": "^4.17.17", "@types/node": "^20.5.9", "@types/passport-facebook": "^3.0.0", "ts-node": "^10.9.1", "typescript": "^4.5.5" }, "dependencies": { "@types/bcryptjs": "^2.4.3", "@types/cookie-parser": "^1.4.3", "@types/cors": "^2.8.13", "@types/dotenv": "^8.2.0", "@types/express-session": "^1.17.7", "@types/express-validator": "^3.0.0", "@types/mongoose": "^5.11.97", "@types/passport": "^1.0.12", "@types/passport-google-oauth20": "^2.0.11", "@types/passport-local": "^1.0.35", "bcryptjs": "^2.4.3", "connect-mongo": "^5.0.0", "connect-mongodb-session": "^3.1.1", "cookie-parser": "^1.4.6", "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", "express-session": "^1.17.3", "express-validator": "^7.0.1", "mongoose": "^7.5.0", "nodemon": "^3.0.1", "passport": "^0.6.0", "passport-facebook": "^3.0.0", "passport-google-oauth20": "^2.0.0", "passport-local": "^1.0.0", "passport-passwordless": "^0.0.1", "ts-node-dev": "^2.0.0" }
解决方案
1. 修复Build脚本的依赖安装问题
Heroku在构建阶段默认会安装所有依赖(包括devDependencies),但你的build命令中重复执行了npm install,这会触发生产模式安装,跳过devDependencies,导致类型声明文件丢失。
修改package.json中的build命令:
"build": "npm run build-dev"
如果必须在build阶段安装依赖,改为显式包含dev依赖:
"build": "npm install --include=dev && npm run build-dev"
2. 解决done参数的隐式any类型错误
在passport.ts中,为done参数添加明确的类型声明:
// 先导入passport的类型 import { DoneCallback } from 'passport'; // 示例:在使用done的回调中添加类型 passport.use(new FacebookStrategy({ // 你的配置 }, (accessToken: string, refreshToken: string, profile: any, done: DoneCallback) => { // 你的业务逻辑 done(null, user); }));
3. 优化connect-mongodb-session的导入方式
避免重复导入,调整app.ts中的代码为:
import session from 'express-session'; import connectMongoDBSession from 'connect-mongodb-session'; import { mongoURI } from './database/connection'; const MongoDBStore = connectMongoDBSession(session); const store = new MongoDBStore({ collection: "sessions", uri: mongoURI, expires: 1000, });
内容的提问来源于stack exchange,提问作者daniel sas
相关产品推荐
相关产品推荐

