维修服务器崩溃,崩溃服务器

崩溃服务器

小背景:

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

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

启动nwjs客户端时,先记录一下 CrashReport/ 目录里的文件名,如果nwjs crash了,下次再启动 nwjs 客户端时,再次扫描 CrashReport/ 就会发现有新的 dmp 文件生成

这时, 就需要把这个新的 dmp 文件 POST 到你自己的服务器上,就是通过简单的POST文件请求喽

考虑到要兼容 xp, 建议不使用nwjs 自己的上传功能,而是所有都由你自己写,其实也简单啦。这样就可以保证统一

然后崩溃服务器也是需要自己写用于处理接收到的dmp文件请求,很简单啦,一两百行代码

服务器代码:

服务器框架(express,koa,node 自带的 http)

header (body-parser)

form (busboy,formidable,multer)处理表单数据,POST 请求中的文件。话可以看看 multer,有中文文档

如果处理这个文件(存储文件,命名唯一。听云接口上传需要的数据)

从第一步开始,记录 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 });

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值