如何基于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
相关产品推荐
相关产品推荐

