今天遇到一个问题,我的代码在公司的客户端上报错了,在浏览器上没问题。公司的客户端可以打开控制台看输出,但是不能打断点,一打断点就卡死了。
先吐槽一下做客户端的同事,都什么年代了,浏览器内核那么强大,他们居然搞的只能靠log来调试。
首先想到的是通过控制台,把相应的对象替换掉。但是出问题的地方是加载完初始化的地方,没机会插入代码,方案失败。
然后想到的是本地起一个服务器,然后配host,改用本地的代码,但是客户端请求用的是https请求,nodejs的http-server只支持http请求,又失败。
再想,用fidder做个拦截,然后把文件替换掉,公司客户端好像是做了限制,fidder抓不到客户端的包,又失败。
最后,还是老老实实弄了个https服务器。
首先要下载http://slproweb.com/download/Win64OpenSSL_Light-1_1_1j.msi用于生成证书。
参考:windows下本地搭建https服务器 - 简书 (jianshu.com)生成证书。具体步骤:
openssl genrsa -out private.key 1024/2038 生成秘钥文件,使用git的命令行工具。
openssl req -new -x509 -key private.key -out cert.pem -days 365 生成证书,需要注意,Common Name要填写自己的域名,比如hanyeah.com,其它随意,一路回车就行。
生成好了,就可以用nodejs写一个服务器了。
最开始是这么写的
const https = require('https'); const fs = require('fs'); const options = { key: fs.readFileSync('private.key'), cert: fs.readFileSync('cert.pem') }; https.createServer(options, function (req, res) { console.log("收到请求"); res.writeHead(200); res.end("hello world\n"); }).listen(80, "127.0.0.1"); console.log("listen: 80");
或者这么写
const express = require('express'); const https = require('https'); const fs = require('fs'); const app = express(); const PORT = 80; const options = { key: fs.readFileSync('./private.key'), cert: fs.readFileSync('./cert.pem') }; https.createServer(options, app) .listen(PORT, () => console.log(`App listening on port ${PORT}!`)); app.get('/', (req, res) => res.send('Hello World!')); app.get('/a.js', (req, res) => res.send('Hello World!a.js'));
一个用了express,一个没用express,express全局安装不能用,只能本地安装。
写好之后,发现必须输入端口号才起作用,不输入端口号不起作用,按说80端口是可以省略的。
后来看到这个javascript - How to create an HTTPS server in Node.js? - Stack Overflow,改成这种写法,成功了。
Express 4.x - API Reference (expressjs.com)
var express = require('express'); var https = require('https'); var http = require('http'); var fs = require('fs'); const path = require('path'); // This line is from the Node.js HTTPS documentation. var options = { key: fs.readFileSync('./private.key'), cert: fs.readFileSync('./cert.pem') }; // Create a service (the app object is just a callback). var app = express(); // Create an HTTP service. http.createServer(app).listen(80); // Create an HTTPS service identical to the HTTP service. https.createServer(options, app).listen(443); app.get('*', (req, res) => { //(1)请求:req console.log(req.url); //(2)处理 if( req.url == '/' ){ //读取html文件响应返回 fs.readFile( path.join(__dirname,'index.html'),(err,data)=>{ if(err) throw err; //(3)响应:res res.end(data); }); }else{ const s = path.join(__dirname,req.url); if (fs.existsSync(s)) { try{ fs.readFile(s,(err,data)=>{ if(err) throw err; //(3)响应:res res.end(data); }); }catch(e){ res.end("open file error:"+e); } } else { res.end("文件不存在:"+req.url); } } }); // app.get('/a.js', (req, res) => res.send('Hello World!a.js'));
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。