26
2021
03

nodejs实现https服务器

今天遇到一个问题,我的代码在公司的客户端上报错了,在浏览器上没问题。公司的客户端可以打开控制台看输出,但是不能打断点,一打断点就卡死了。

先吐槽一下做客户端的同事,都什么年代了,浏览器内核那么强大,他们居然搞的只能靠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'));


« 上一篇下一篇 »

相关文章:

nodejs目录遍历(转)  (2016-5-17 10:54:37)

Nodejs使用access数据库  (2016-5-12 12:31:6)

nodejs加载本地模块出错  (2016-5-11 17:54:44)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。