崩溃服务器

崩溃服务器

小背景:
客户端需要将崩溃报告上传到服务器,需要自己写上传服务,啊木有写过上传服务,大神给两个链接demo作为参考,在看demo的过程当中发现根本看不懂!所以就把见到的新东西做个总结。

  • CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. CoffeeScript 尝试用简洁的方式展示 JavaScript 优秀的部分.CoffeeScript 的指导原则是: "她仅仅是 JavaScript". 代码一一对应地编译到 JS, 不会在编译过程中进行解释. 已有的 JavaScript 类库可以无缝地和 CoffeeScript 搭配使用, 反之亦然. 编译后的代码是可读的, 且经过美化, 能在所有 JavaScript 环境中运行, 并且应该和对应手写的 JavaScript 一样快或者更快.
  • Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。它采用"Logic-less template"(无逻辑模版)的思路,在加载时被预编译,而不是到了客户端执行到代码时再去编译, 这样可以保证模板加载和运行的速度。
  • Sequelize 是一个基于promise的关系型数据库ORM框架,当前支持MySQL、SQLite、PostgreSQL、Sql Server等数据库。这个库完全采用JavaScript开发并且可以用在Node.js环境中,易于使用

小背景2:
啊幸好有两个大神辅助,给我列了需要给客户端崩溃文件上传为目的,写一个崩溃服务器应该需要的几个步骤

  1. 启动nwjs客户端时,先记录一下 CrashReport/ 目录里的文件名,如果nwjs crash了,下次再启动 nwjs 客户端时,再次扫描 CrashReport/ 就会发现有新的 dmp 文件生成
  2. 这时, 就需要把这个新的 dmp 文件 POST 到你自己的服务器上,就是通过简单的POST文件请求喽
  3. 考虑到要兼容 xp, 建议不使用nwjs 自己的上传功能,而是所有都由你自己写,其实也简单啦。这样就可以保证统一
    然后崩溃服务器也是需要自己写用于处理接收到的dmp文件请求,很简单啦,一两百行代码

服务器代码:

  1. 服务器框架(express,koa,node 自带的 http)
  2. header (body-parser)
  3. form (busboy,formidable,multer)处理表单数据,POST 请求中的文件。话可以看看 multer,有中文文档
  4. 如果处理这个文件(存储文件,命名唯一。听云接口上传需要的数据)

从第一步开始,记录 CrashPad 目录里的文件名,Windows 和 xp 的路径是不一样的,可以先使用 os.homedir 获取当前用户文件夹,然后拼接路径

首先需要使用 fs.readdir 获取目录下崩溃文件名数组,带后缀方便判断是否为dmp文件,之前刚开始使用这个函数发现异步,在网上找了一下是否有可以使用 await 的方法来使他运行之后得到结果,再进行接下来的步骤。

后来用 Promise 就解决啦,然后发现 fs.readdir 本来还有一个 option ,其中有一个参数 withFileTypes 设置为 true 返回文件fs.Dirent数组,发现 xp 不可用又取消了这个选项。现在返回的就是带后缀名的文件名,字符串数组。

function readdir (src) {
    return new Promise(function (resolve, reject) {
        fs.readdir(src, function (err, files) {
            if (err) {
                reject(err);
            } else {
                resolve(files)
            }
        })
    })
}

然后每次得到的文件名想要存在 localforage 里面,但是不知道为什么时有时无,所以在考虑是不是上传成功之后删除用户文件夹中的 dmp 文件。或者使用其他存储方式。xp 里面的崩溃文件较多 localstorage 存储觉得不太合适。


第二步就需要尝试自己写服务器啦,真是有些崩溃,大神说很简单两百行代码!让我加油,可是啊我接到崩溃服务器这个人物的时候,里面每一个词都不了解听都听不懂的任务!然后我百度了一下 “自己写一个服务器” 加上关键字 express 哈哈

这个是写在客户端的接受 post 请求的代码

var express = require("express");
var path = require("path");
var app = express();
//监听
app.listen(6080);
app.post("/upload", function(request, respones) {
    console.log("/upload comming");
    // 获得url上传来的参数
    console.log(request.query);
    // 获得用户给我们发送过来的数据
    // 监听我们的data来获得
    request.on("data", function(data) {
        console.log(data.toString());
        respones.send("UPLOAD OK"); 
    });
});

接下来就是客户端里面的post代码

function http_post(ip, port, url, params, body, callback) {
    // step1,创建一个 http.ClientRequest
    var options = {
        host: "127.0.0.1",
        port: port,
        path: url + "?" + params,
        method: "POST",
        headers: {
            "Content-Type": "application/x-www-form-urlencoded",
            "Content-Length": body.length
        }
    };
    var req = http.request(options, function(incoming_msg) {
        console.log("respones status " +          incoming_msg.statusCode);
        // 监听IncomingMessage的data事件,当收到服务器发过来的数据的时候,触发这个事件
        incoming_msg.on("data", function(data) {
            if (incoming_msg.statusCode === 200) {
                callback(true, data);
            }
        });
    });
    // step2 写入body数据
    req.write(body);
    // 发送请求
    req.end();
}

http_post("127.0.0.1", 6080, "/upload", "filename=my_file.txt", "Hello Htpp Post", function(is_ok, data) {
    if (is_ok) {
        console.log("upload_success", data.toString()); 
    }
});

因为平常我们发请求用的 Axios 所以改造成了

export async function upload_dmp(dmp:any) {
    const url = `http://127.0.0.1:6080/upload?filename=hytfile.txt`;
    const request_config:AxiosRequestConfig = {
        url,
        method: 'post',
        data: {
            dmp,
        },
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
        },
        withCredentials: true,
    };
    return Axios(request_config)
        .then(function (res:any) {
            console.log(res.data);
            console.log(res.status);
    });
}

对于客户端接受崩溃文件,要介绍一个强大工具!
Multer!!!!

基本上木有任何阻碍,简单的代码就可以完成文件的接收。

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })

var app = express()

app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // req.file is the `avatar` file
  // req.body will hold the text fields, if there were any
})

app.post('/photos/upload', upload.array('photos', 12), function (req, res, next) {
  // req.files is array of `photos` files
  // req.body will contain the text fields, if there were any
})

最后需要加上 express 错误处理
文档

文档写的十分明白了,错误从异步代码中返回必须加上 next 函数,express 会处理

如果你已经开始向 response 输出数据了,这时才调用 next() 并传递了一个 error,比如你在将向客户端输出数据流时遇到一个错误,Express 内置的缺省错误处理句柄将帮你关闭连接并告知 request 请求失败。

function errorHandler(err, req, res, next) {
  if (res.headersSent) {
    return next(err);
  }
  res.status(500);
  res.render('error', { error: err });
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 8,618评论 0 3
  • 面试题一:https://github.com/jimuyouyou/node-interview-questio...
    R_X阅读 1,573评论 0 5
  • javascript功能插件大集合,写前端的亲们记得收藏 包管理器管理着 javascript 库,并提供读取和打...
    狗狗嗖阅读 738评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,034评论 1 32
  • 工作之余,扩展一下基金知识,本书中的内容大多摘录自雪球大V的《指数基金投资指南》,非常适合新手学习。 基本概念 宽...
    木子李_af14阅读 733评论 1 3