当前位置: 首页 > news >正文

从头编写一个 HTTP 静态资源服务器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

首先需要的Node 模块有 http,url,path,fs 模块。

// 提供一个http 服务
var http = require('http');
// 用于处理 url 字符串和 url对象
var url = require('url');
// 用于处理文件路径
var path = require('path');
// fs 模块  用于读取文件的
var fs = require('fs');

然后要用 http模块来创建一个http模块。

http.createServer(function(request,response){
  // 
})

当一个http 请求过来的时候,需要解析request.url 字段,利用url.parse()将request.url 字符串转义成url 对象。

var pathName = url.parse(request.url).pathname;

这里假设的是把js文件所在的目录作为静态服务器的地址。

 var realName = path.join('.', pathName);

然获取到请求资源的文件类型

var ext = path.extname(pathName);
ext = ext ? ext.slice(1) : 'unknown';

然后判断文件是否存在,如果存在,则返回文件,否者返回404

// 判断文件是否存在。
fs.exists(realName, function (exists) {

})

如果不存在

 if (!exists) {
   response.writeHead(404, {'Context-type' : 'text/plain'});
   response.write('this request url' + pathName + ' was not found on this server.');
   response.end();
}

如果文件存在,则读取文件的二进制流

var requestType = {
    "css" : "text/css",
    "js" : "text/javascript",
    "html":"text/html"
};

fs.readFile(realName, 'binary', function (err, file) {
     if (err) {
        response.writeHead(500, {'Context-type' : 'text/plain'});
       response.end(err);
     }
     else {

           var contentType = requestType[ext] || "text/plain";
           response.writeHead(200, {'Context-type' : contentType});
           response.write(file, 'binary');
           response.end();
     }
});

这样,一个简单的HTTP 静态资源服务器就写好了。

贴上项目地址:https://github.com/bosscheng/simple-http-server

转载于:https://my.oschina.net/bosscheng/blog/2240234

相关文章:

  • 简单手撸代码进入SMP2018中文人机对话技术评测任务一前三甲
  • 小程序开发之插件功能的有效实现方法
  • 数据库 Oracle12c (三):安装与启动
  • elasticsearch实战---中文拼音A-Z排序(完美解决)
  • NOIP2018 游记
  • Python 的经典设计格言,格言来源于 Python 但不限于 Python
  • 关于微信小程序登录,后端如何生成3rd_session?(后端为c#)
  • hadoop和spark的区别
  • 解决Composer 使用时要求输入授权用户名密码问题
  • Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
  • gitlab 502问题解决
  • CEF与代理
  • VS2010安装与启动
  • jQuery快速入门
  • 线下比特币现金交易的区块链创企CoinText.io完成60万美元种子轮融资
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Apache Pulsar 2.1 重磅发布
  • flutter的key在widget list的作用以及必要性
  • GitUp, 你不可错过的秀外慧中的git工具
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • passportjs 源码分析
  • Python学习之路16-使用API
  • React组件设计模式(一)
  • SQL 难点解决:记录的引用
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 手写双向链表LinkedList的几个常用功能
  • 通过npm或yarn自动生成vue组件
  • 微信开放平台全网发布【失败】的几点排查方法
  • 由插件封装引出的一丢丢思考
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • 整理一些计算机基础知识!
  • ​io --- 处理流的核心工具​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #13 yum、编译安装与sed命令的使用
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $.ajax()参数及用法
  • ( 10 )MySQL中的外键
  • (1)(1.13) SiK无线电高级配置(六)
  • (Java)【深基9.例1】选举学生会
  • (js)循环条件满足时终止循环
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)springboot教学评价 毕业设计 641310
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十三)Flask之特殊装饰器详解
  • (转)程序员技术练级攻略
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .sys文件乱码_python vscode输出乱码
  • /etc/sudoers (root权限管理)
  • @synthesize和@dynamic分别有什么作用?
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 第一章] JavaScript 简史