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

如何基于Express服务器实现Electron CrashReporter崩溃报告接收?

解决Electron崩溃报告接收API问题

错误原因

Cannot read properties of undefined (reading 'filename') 说明你尝试读取的req.file是undefined,本质是multer没有正确解析Electron发送的multipart请求,大概率是字段名不匹配或multer配置错误。

正确的API实现步骤

1. 确认依赖配置

确保你的package.json已包含所需依赖:

{
  "dependencies": {
    "express": "^4.18.2",
    "multer": "^1.4.3"
  }
}

2. 完整Express API代码

以下代码适配Electron 15.0.0的CrashReporter请求格式,可处理Windows/Linux/macOS的崩溃文件:

const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');

const app = express();
const PORT = 3000;

// 配置multer存储规则:自定义存储目录和文件名
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    const uploadDir = path.join(__dirname, 'crash-reports');
    // 自动创建不存在的目录
    if (!fs.existsSync(uploadDir)) fs.mkdirSync(uploadDir, { recursive: true });
    cb(null, uploadDir);
  },
  filename: (req, file, cb) => {
    // 生成唯一文件名,避免重复覆盖
    const uniqueName = `${Date.now()}-${file.originalname}`;
    cb(null, uniqueName);
  }
});

// 处理崩溃报告的POST路由
app.post('/crash-report', (req, res) => {
  // 先尝试解析Windows/Linux的minidump文件
  const uploadMinidump = multer({ storage }).single('upload_file_minidump');
  uploadMinidump(req, res, (err) => {
    if (err) {
      console.error('Minidump上传失败:', err);
      return res.status(500).send('上传出错');
    }

    // 如果没拿到文件,尝试解析macOS的dsym文件
    if (!req.file) {
      const uploadDsym = multer({ storage }).single('upload_file_dsym');
      uploadDsym(req, res, (dsymErr) => {
        if (dsymErr || !req.file) {
          console.error('未接收到有效崩溃文件');
          return res.status(400).send('无有效崩溃文件');
        }
        // 记录崩溃附加信息(Electron自带的版本、平台等字段)
        const crashLog = {
          fileName: req.file.filename,
          appVersion: req.body.ver,
          platform: req.body.platform,
          processType: req.body.process_type
        };
        console.log('收到macOS崩溃报告:', crashLog);
        res.status(200).send('报告已接收');
      });
      return;
    }

    // 处理Windows/Linux的崩溃报告
    const crashLog = {
      fileName: req.file.filename,
      appVersion: req.body.ver,
      platform: req.body.platform,
      processType: req.body.process_type
    };
    console.log('收到崩溃报告:', crashLog);
    res.status(200).send('报告已接收');
  });
});

app.listen(PORT, () => {
  console.log(`崩溃报告服务器运行在 http://localhost:${PORT}`);
});

3. 核心注意事项

  • 字段名匹配:Electron发送的文件字段名不是通用的file,Windows/Linux为upload_file_minidump,macOS为upload_file_dsym,必须对应指定。
  • 目录权限:确保Node进程拥有crash-reports目录的读写权限。
  • 多平台兼容:代码中做了双字段兼容,避免只适配单一系统。
  • 表单数据:Electron会附带ver(应用版本)、platform(系统平台)等字段,可通过req.body读取。

4. API测试方法

用curl模拟Electron请求验证:

# 模拟Windows/Linux崩溃报告请求
curl -X POST -F "upload_file_minidump=@./test.dmp" -F "ver=15.0.0" -F "platform=win32" http://localhost:3000/crash-report

# 模拟macOS崩溃报告请求
curl -X POST -F "upload_file_dsym=@./test.dsym.zip" -F "ver=15.0.0" -F "platform=darwin" http://localhost:3000/crash-report

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:14:54