You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何部署基于Express和Botkit的Cisco Webex Teams Node.js机器人?

解决Heroku部署Cisco Webex Teams Node.js机器人的双端口与存储问题

你遇到的两个核心问题是Heroku的单端口限制临时文件系统特性,我来一步步帮你解决:

一、合并Express与Botkit到单端口(解决双端口问题)

Heroku只允许应用绑定一个由环境变量PORT提供的动态端口,无法同时监听3000和8080。我们可以把Botkit的Webhook整合到现有Express应用中,共用同一个端口:

修改后的核心代码

// 优先使用Heroku提供的PORT,本地开发默认3000
const port = process.env.PORT || 3000;
// 生产环境用Heroku分配的域名,本地用ngrok地址
const PUBLIC_URL = process.env.PUBLIC_URL;

const express = require('express');
const app = express();
const Botkit = require('botkit');

// 初始化Botkit,用环境变量存敏感信息(绝对不要硬编码!)
const controller = Botkit.webexbot({
  log: true,
  public_address: PUBLIC_URL,
  access_token: process.env.ACCESS_TOKEN,
  secret: process.env.SECRET,
  webhook_name: process.env.WEBHOOK_NAME || 'Email2Webex',
});

// 让Botkit复用现有Express app创建Webhook端点,不再单独开8080端口
controller.createWebhookEndpoints(app, () => {
  console.log("Webhooks set up successfully!");
});

// 保留你的mailgun路由
app.post('/mailgun', upload.any(), (req, res) => {
  res.end('ok');
});

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

关键改动说明

  • 移除了Botkit单独的setupWebserver调用,直接复用Express实例
  • 所有敏感配置(令牌、密钥)改用环境变量,避免代码泄露
  • 端口使用process.env.PORT,完美适配Heroku的动态端口分配

二、解决动态文件存储(fs.write)问题

Heroku的文件系统是临时态的,任何写入本地的文件会在应用重启(部署、缩放、睡眠唤醒)后彻底丢失。你需要替换为持久化存储方案:

可选方案

  1. 云存储服务:比如AWS S3、Google Cloud Storage,用aws-sdkmulter-s3等库把文件上传到云存储,替代本地写入。
  2. 数据库存储:如果是小文本数据,用Heroku自带的PostgreSQL/MongoDB Add-on存储内容,不要存本地文件。
  3. 规避本地写入:如果业务允许,直接把数据通过API传递或存在内存(仅适合临时数据,重启后会丢失)。

三、完整Heroku部署步骤

  1. 准备工作

    • 安装Heroku CLI并登录账号
    • 项目根目录初始化Git仓库:git initgit add .git commit -m "Initial deploy"
  2. 创建Heroku应用

    heroku create your-unique-app-name
    
  3. 配置环境变量
    在Heroku控制台的「设置」→「Config Vars」中添加以下变量:

    • ACCESS_TOKEN: 你的Webex Teams令牌
    • SECRET: Webex的Secret密钥
    • PUBLIC_URL: Heroku分配的应用域名(比如https://your-unique-app-name.herokuapp.com
    • WEBHOOK_NAME: 你的Webhook名称(可选)
  4. 完善package.json
    确保有start脚本,且所有依赖都在dependencies中(Heroku不安装devDependencies):

    {
      "scripts": {
        "start": "node your-main-file.js"
      },
      "dependencies": {
        "express": "^4.18.2",
        "botkit": "^0.7.2",
        // 其他依赖比如multer、aws-sdk等按需添加
      }
    }
    
  5. 部署代码

    git push heroku main
    
  6. 验证与收尾

    • 查看日志排查问题:heroku logs --tail
    • 打开应用:heroku open
    • 更新Webex Teams的Webhook地址为你的Heroku域名,确保Botkit能正常接收事件

额外提示

  • 本地开发时可以用dotenv库加载.env文件的环境变量,保持本地与生产环境一致
  • Heroku应用会在30分钟无请求后进入睡眠状态,若需要持续运行,可使用UptimeRobot等服务定期ping你的应用URL

内容的提问来源于stack exchange,提问作者SkroS

火山引擎 最新活动