本文转载自:http://www.cnblogs.com/shawn-xie/archive/2013/06/06/3121173.html

由于不做php相关的东西,懒得装apache,干脆利用nodejs搭建一个本地的服务器用于测试。

nodejs这玩意儿吧,对做前端的介入后端简直就是一把利器。而且目前,nodejs也越来越有商用价值。

nodejs其实是非常底层的,从功能上说,它既是apache也是php。像搭建http服务器这种功能,本来是apache已经封装好的,但nodejs需要我们手动来搭建。其实在实际应用中,我们可以使用现成的框架。但这里,我想手动搭建,也加深一下对http服务器的理解。

我们node执行下面这个文件,我命名为http.js,它将创建一个httpServer并监听3000端口。

  1. var PORT = 3000;
  2.  
  3. var http = require('http');
  4. var url=require('url');
  5. var fs=require('fs');
  6. var mine=require('./mine').types;
  7. var path=require('path');
  8.  
  9. var server = http.createServer(function (request, response) {
  10. var pathname = url.parse(request.url).pathname;
  11. var realPath = path.join("assets", pathname);
  12. //console.log(realPath);
  13. var ext = path.extname(realPath);
  14. ext = ext ? ext.slice(1) : 'unknown';
  15. fs.exists(realPath, function (exists) {
  16. if (!exists) {
  17. response.writeHead(404, {
  18. 'Content-Type': 'text/plain'
  19. });
  20.  
  21. response.write("This request URL " + pathname + " was not found on this server.");
  22. response.end();
  23. } else {
  24. fs.readFile(realPath, "binary", function (err, file) {
  25. if (err) {
  26. response.writeHead(500, {
  27. 'Content-Type': 'text/plain'
  28. });
  29. response.end(err);
  30. } else {
  31. var contentType = mine[ext] || "text/plain";
  32. response.writeHead(200, {
  33. 'Content-Type': contentType
  34. });
  35. response.write(file, "binary");
  36. response.end();
  37. }
  38. });
  39. }
  40. });
  41. });
  42. server.listen(PORT);
  43. console.log("Server runing at port: " + PORT + ".");

上面我们还引入了一个mine.js,这是我自己写的,里面存储的是名值对,用于定义不同后缀的文件所对应的返回方式:

  1. exports.types = {
  2. "css": "text/css",
  3. "gif": "image/gif",
  4. "html": "text/html",
  5. "ico": "image/x-icon",
  6. "jpeg": "image/jpeg",
  7. "jpg": "image/jpeg",
  8. "js": "text/javascript",
  9. "json": "application/json",
  10. "pdf": "application/pdf",
  11. "png": "image/png",
  12. "svg": "image/svg+xml",
  13. "swf": "application/x-shockwave-flash",
  14. "tiff": "image/tiff",
  15. "txt": "text/plain",
  16. "wav": "audio/x-wav",
  17. "wma": "audio/x-ms-wma",
  18. "wmv": "video/x-ms-wmv",
  19. "xml": "text/xml"
  20. };

fs模块是用于读取文件的,提供读取文件的方法,其实仔细研究文档会发现,它有同步和异步两种读取方式。fs.exists这个方法网上很多文章写作path.exists,,现在推荐写作fs.exists这个方法。否则会报警:

需要注意的是,不仅浏览器访问html文件会形成一次访问,里面链接的js,css等外部文件也会分别形成一次http访问。所以,http.createServer的回调其实是在一次页面访问中执行了多次的。我们console.log(realPath)一下就可以看到:

这里并没有加入默认访问index.html的功能,所以访问地址要写全http://127.0.0.1:3000/index.html


如果根目录默认访问index.html的话可以用下面这段代码:

  1. if (pathName.charAt(pathName.length - 1) == "/") {
  2. //如果访问目录
  3. pathName += "index.html"; //指定为默认网页
  4. }

另外,如果想提供下载文件功能可以使其他扩展名的文件使用"application/octet-stream"来做返回类型。

(转)nodejs搭建本地http服务器的更多相关文章

  1. nodejs 搭建本地静态服务器

    1. http-server 参看 https://www.npmjs.com/package/http-server 使用http-server搭建本地静态服务器 全局安装http-server n ...

  2. web前端效率提升-nginx+nodejs搭建本地生态

    1.起因 编写的项目是一个偏向于后台管理的web系统,使用了angular框架,在绑定数据的时候就依赖于后台的接口格式. 以前是后台写好接口后,我在绑定,在这之前一些逻辑是没法做的,有时候后台接口给的 ...

  3. Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析

    默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...

  4. [转]World Wind Java开发之四——搭建本地WMS服务器

    在提供地理信息系统客户端时,NASA还为用户提供了开源的WMS Server 服务器应用:World Wind WMS Server.利用这个应用,我们可以架设自己的WMS服务并使用自己的数据(也支持 ...

  5. Dnsmasq安装与配置-搭建本地DNS服务器

    默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...

  6. 配置Yum源repo文件及搭建本地Yum服务器

    分享一篇配置Yum源repo文件及搭建本地Yum服务器的方法,希望对大家有用. Yum源的话有三大类: Base Extra Epel Base:就是你下载的光盘镜像里面的DVD1Extra:就是你下 ...

  7. Windows下搭建本地SVN服务器【转】

    转自:http://www.linuxidc.com/Linux/2015-01/111563.htm 本文介绍Windows下搭建本地SVN服务器的方法,网上资料比较少也比较旧,大都介绍的是旧版本S ...

  8. svn 使用TortoiseSVN server搭建本地SVN服务器

    使用TortoiseSVN server搭建本地SVN服务器

  9. 利用 Nginx 反向代理搭建本地 yum 服务器

    在政府,医院等单位有网络安全要求,对内外网进行物理隔离,然而内网主机无法访问互联网下载安装包,通过Nginx 反向代理搭建本地yum服务器实现内网主机安装包下载. Centos 8.2 部署 Ngin ...

随机推荐

  1. 时间插件之My97DatePickerBeta

    My97DatePickerBeta使用很简单 1.在jsp页面中 引入JS 下载地址:链接: https://pan.baidu.com/s/1bp5uzuv 密码: ya9a <script ...

  2. 【转载】树链剖分.By.Xminh

    轻重链剖分 其实就是俗称的树链剖分. PS:树链剖分不止有轻重链剖分.但是大多数时候的树链剖分指的就是轻重链剖分. dfs序 给树的节点重新编号,使得任意一个节点满足子树的dfs序都比它要大,而且它子 ...

  3. IDEA配置文件的保存目录

    IntelliJ IDEA 的实时代码模板保存在 /templates 目录下,其他系统目录位置如下:(因为目录名在各个系统上是一致的,建议用硬盘搜索工具搜索即可) Windows: . Linux: ...

  4. JavaWeb中的中文编码问题

    一.为什么要编码? 1.在计算机中存储信息的最小单元是1字节,即8个bit,所以能表示的字符范围是0~255个. 2.人类要表示的符号太多,无法用1个字节来完全表示. 这就是矛盾,要解决这个矛盾,就出 ...

  5. python快速学习-常用內建模块

  6. 设计高效sql一般经验谈

      1不用在sql语句使用系统默认的保留关键字 2尽量用exists 和 not exists 代替 in 和 not in 这条在sql2005之后,在索引一样,统计信息一样的情况下,exists ...

  7. The tag handler class for "home.jsp" (org.apache.taglibs.standard.tag.rt.core.ForEachTag) was not found on the Java Build Path

    web.xml中 listener,filter,servlet需按顺序. <listener> <listener-class>listener.VisitCountList ...

  8. 测试通过!为何线上还有很多BUG?

    质量控制 大多数测试人员认为测试工作是发现bug,虽然这是测试的主要任务,但其实测试最重要的任务是质量控制,而发现bug和验证bug只是质量控制的一个重要环节而已. 我想很多测试人员都经历过这样的场景 ...

  9. 163的Ubuntu apt镜像源

    在/etc/apt/sources.list靠前的地方加入即可. 说明:http://mirrors.163.com/.help/ubuntu.html #15.10 wily, 15.04 vivi ...

  10. Docker 介绍安装

    简介: Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行 ...