崩溃服务器

崩溃服务器

小背景:
客户端需要将崩溃报告上传到服务器,需要自己写上传服务,啊木有写过上传服务,大神给两个链接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 });
}

你可能感兴趣的:(崩溃服务器)