今天遇到一个问题,我的代码在公司的客户端上报错了,在浏览器上没问题。公司的客户端可以打开控制台看输出,但是不能打断点,一打断点就卡死了。
先吐槽一下做客户端的同事,都什么年代了,浏览器内核那么强大,他们居然搞的只能靠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'));
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。