前言
已有系统片上实现了一个http_server(html + easyui), 给浏览器用。
正常用时,是用STM32分析浏览器get/post过来的数据,然后回数据给socket连接。
但是调试时,如果将修改后的http_server(html)内容写入SD卡,将下位机打开,按照正常流程调试,很麻烦。
离职的同事写了一个server_test.js,在windows本地用nodejs跑起来,有关UI的部分,就可以直接在本地试验(浏览器的请求由server_test.js来模拟响应),看起来很方便。
前段时间,不需要动UI. 只是试了一下Nodejs带着server_test.js跑起来,发现只要浏览器有请求,加载的模拟server_test.js就会崩掉。时间紧,就没看具体啥原因。
这几天,我需要加些子页面到http_sever, 确实要看一下,用nodejs怎么调试server_test.js。
去查资料,看到大家用vscode + nodejs好像挺方便的。
试验
找了几本书,开始装的是appserv-x64-9.2.0.exe
将SD卡上的片上http_server资源放到WWW目录下,是能正常访问首页的。但是后续逻辑继续不下去。
发现这东西如果要响应浏览器请求,要用php写响应代码。如果不写php代码,浏览器访问片上的逻辑过不去。
想到同事写好的server_test.js, 那用Nodejs带着跑一下。
装了 node-v10.16.3-x64.msi
打开vscode(以前安装过一个旧版),升级到最新。
选择打开文件夹,到试验的http_server素材目录顶层。
打开server_test.js,直接可以下F9断点, F5跑起, F10, F11单步调试。不需要像网上资料说的那样,还要设置。
第一次跑的时候,报错退出, 看到提示是80端口被占用了,改成8081.
}).listen(8081);
当浏览器有请求时,我要先判断登陆是否正确,在Nodejs读本地json文件时报错退出。看了一下,好像是json文件编码格式不对,是(UTF8 + BOM). 用EditPlus打开,另存位UTF8.
再将server_test.js跑起时,正常响应,不会报错退出。浏览器页面上的数据也正常了。
剩下的事情,就是看easyui的书,将需要的页面元素加上去。
提供get响应的nodejs服务
整理出来一段实现,如果只是想试试easyui的界面效果,用这段就行。
// @file \http_server_for_get.js
console.log(">> http_server_for_get.js");
var http = require("http");
var url = require("url");
var fs = require("fs");
var path = require("path");
http.createServer(function (req, res) {
req.setEncoding('utf-8');
var file_name = url.parse(req.url).pathname;
if (("" == file_name) || ("/" == file_name)) {
file_name="/default.html";
}
var pathname = __dirname + file_name;
console.log("htm file path name = " + pathname);
if (("GET" == req.method)
|| ("get" == req.method)) {
// get method
fs.exists(pathname,function(exists) {
if (exists) {
switch(path.extname(pathname)){
case ".htm":
case ".html":
res.writeHead(200, {"Content-Type": "text/html"});
break;
case ".TXT":
res.writeHead(200, {"Content-Type": "application/json","Pragma": "no-cache","Cache-Control": "no-cache, no-store, max-age=0","Expires":"1L"});
break;
case ".js":
res.writeHead(200, {"Content-Type": "text/javascript","Cache-control": "max-age=315360000000","Expires":"Thu, 15 Apr 2100 20:00:00 GMT"});
break;
case ".css":
res.writeHead(200, {"Content-Type": "text/css","Cache-control": "max-age=315360000000","Expires":"Thu, 15 Apr 2100 20:00:00 GMT"});
break;
case ".gif":
res.writeHead(200, {"Content-Type": "image/gif","Cache-control": "max-age=315360000000","Expires":"Thu, 15 Apr 2100 20:00:00 GMT"});
break;
case ".jpg":
res.writeHead(200, {"Content-Type": "image/jpeg","Cache-control": "max-age=315360000000","Expires":"Thu, 15 Apr 2100 20:00:00 GMT"});
break;
case ".png":
res.writeHead(200, {"Content-Type": "image/png","Cache-control": "max-age=315360000000","Expires":"Thu, 15 Apr 2100 20:00:00 GMT"});
break;
case ".mp3":
res.writeHead(200, {"Content-Type": "audio/mpeg","Cache-control": "max-age=315360000000","Expires":"Thu, 15 Apr 2100 20:00:00 GMT"});
break;
default:
res.writeHead(200, {"Content-Type": "application/octet-stream"});
}
fs.readFile(pathname,function (err,data){
res.end(data);
});
} else {
res.writeHead(404, {"Content-Type": "text/html"});
res.end("<h1>error : 404 Not Found</h1>");
}
});
} else {
// post method
}
}).listen(8004);
// http://localhost:8004/
console.log("<< http_server_for_get.js");