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

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 
       
-----&gt; Build
       Running build
       
       &gt; server@1.0.0 build
       &gt; 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
       
       &gt; server@1.0.0 build-dev
       &gt; 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.
-----&gt; 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:54:51