加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.cn/)- 云渲染、网络安全、数据安全、数据分析、人体识别!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

Node.js 原生 api 搭建 web 服务器

发布时间:2019-02-16 03:32:06 所属栏目:外闻 来源:想不起来了
导读:node.js 实现一个简单的 web 服务器还是比较简单的,以前利用 express 框架实现过『nodeJS搭一个简单的(代理)web服务器』。代码量很少,可是使用时需要安装依赖,多处使用难免有点不方便。于是便有了完全使用原生 api 来重写的想法,也当作一次 node.js 复

2、代理功能

  1. // 代理列表 
  2. const proxyTable = { 
  3.   '/api': { 
  4.     target: 'http://127.0.0.1:8090/api', 
  5.     changeOrigin: true 
  6.   } 
  7. } 
  8. // 处理代理列表 
  9. function processProxy(req, res) {   
  10.   const requestUrl = req.url   
  11.   const proxy = Object.keys(proxyTable)   
  12.   let not_found = true 
  13.   for (let index = 0; index < proxy.length; index++) {     
  14.       const k = proxy[index]     
  15.       const i = requestUrl.indexOf(k)     
  16.       if (i >= 0) { 
  17.         not_found = false 
  18.         const element = proxyTable[k]       
  19.         const newUrl = element.target + requestUrl.slice(i + k.length)       
  20.         if (requestUrl !== newUrl) {        
  21.           const u = url.parse(newUrl, true)         
  22.           const options = { 
  23.             hostname : u.hostname,  
  24.             port     : u.port || 80, 
  25.             path     : u.path,        
  26.             method   : req.method, 
  27.             headers  : req.headers, 
  28.             timeout  : 6000 
  29.           }         
  30.           if(element.changeOrigin){ 
  31.             options.headers['host'] = u.hostname + ':' + ( u.port || 80) 
  32.           }         
  33.           const request = http 
  34.           .request(options, response => {             
  35.             // cookie 处理 
  36.             if(element.changeOrigin && response.headers['set-cookie']){ 
  37.               response.headers['set-cookie'] = getHeaderOverride(response.headers['set-cookie']) 
  38.             } 
  39.             res.writeHead(response.statusCode, response.headers) 
  40.             response.pipe(res) 
  41.           }) 
  42.           .on('error', err => {            
  43.             res.statusCode = 503 
  44.             res.end() 
  45.           }) 
  46.         req.pipe(request) 
  47.       }       
  48.       break 
  49.     } 
  50.   }   
  51.   return not_found 
  52. } 
  53. function getHeaderOverride(value){   
  54.   if (Array.isArray(value)) {       
  55.    for (var i = 0; i < value.length; i++ ) { 
  56.      value[i] = replaceDomain(value[i]) 
  57.    } 
  58.   } else { 
  59.     value = replaceDomain(value) 
  60.   }   
  61.   return value 
  62. } 
  63. function replaceDomain(value) {   
  64.   return value.replace(/domain=[a-z.]*;/,'domain=.localhost;').replace(/secure/, '') 
  65. } 

3、完整版

(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读