搭建简单的nodejs http服务器详解


Posted in NodeJs onMarch 09, 2017

搭建简单的nodejs服务器

通过一些简单配置我们就可以搭建一台基于nodejs的http服务器

通过switch配置url路由的方法

// 这是一个简单的Node HTTP服务器,能处理当前目录的文件
// 并能实现两种特殊的URL用于测试
// 用HTTP://localhost:8000或http://127.0.0.1:8000连接这个服务器

// 首先加载所有需要用到的模块
var http = require('http');    // 加载http服务api模块
var fs = require('fs');      // 加载fs文件服务api模块
var server = new http.Server();  // 创建新的HTTP服务器
var urlapi = require('url');    // 创建url路由api模块
server.listen(8000);       // 监听端口8000

// 使用on方法注册事件处理,该事件一直被监听,任何的请求都会进入回调函数,执行相应的操作
server.on('request', function(request, response) { // 当有request请求的时候触发处理函数  
  // 解析请求的URL
  var url = urlapi.parse(request.url);

  //监听请求的网站,以当前脚本目录为根目录的url地址
  console.log(url.pathname);

  // 特殊URL会让服务器在发送响应前先等待
  switch(url.pathname) {  //判断请求的路径信息
  case ''||'/' : // 处理请求的网站根目录,指定加载对应的文件夹,一般以根目录的index.html为默认,nodejs是高效流处理的方案,也可以通过配置文件来配置
    fs.readFile("./page/index.html", function(err, content){ //打开请求的文件
      if(err) { //输出错误信息,也可以自定义错误信息
        response.writeHead(404, { 'Content-Type':'text/plain; charset="UTF-8"' });
        response.write(err.message);
        response.end();
      } else { //请求成功返回数据
        response.writeHead(200, { 'Content-Type' : 'text/html; charset=UTF-8' }); //告诉相应头文件,返回数据的类型
        response.write(content); //返回的内容,有时候还会加上buter数据类型
        response.end(); //结束响应,不写的话,会一直处于响应状态,页面不会显示内容
      }
    });
    break;
  case '/test/delay':// 此处用于模拟缓慢的网络连接
    // 使用查询字符串来获取延迟时长,或者2000毫秒
    var delay = parseInt(url.query) || 2000;
    // 设置响应状态和头
    response.writeHead(200, {'Content-type':'text/plain; charset=UTF-8'});
    // 立即开始编写响应主体
    response.write('Sleeping for' + delay + ' milliseconds...');
    // 在之后调用的另一个函数中完成响应
    setTimeout(function(){
      response.write('done.');
      response.end();
    }, delay);
    break;

  case '/test/mirror':// 如果请求是test/mirror,则原文返回它
    // 响应状态和头
    response.writeHead(200, {'Content-type':'text/plain; charset=UTF-8'});
    // 用请求的内容开始编写响应主体
    response.write(request.mothod + ' ' + request.url + ' HTTP/' + request.httpVersion + '\r\n');
    // 所有的请求头
    for (var h in request.headers) {
      response.write(h + ':' + request.headers[h] + '\r\n');
    }
    response.write('\r\n');// 使用额外的空白行来结束头
    // 在这些事件处理程序函数中完成响应
    // 当请求主体的数据块完成时,把其写入响应中
    request.on('data', function(chunk) { response.write(chunk); });
    // 当请求结束时,响应也完成
    request.on('end', function(chunk){ response.end(); });
    break;

  case '/json' : // 模拟JSON数据返回
    // 响应状态和头
    response.writeHead(200, {'Content-type':'application/json; charset=UTF-8'});
    response.write(JSON.stringify({test:'success'}));
    response.end();
    break;

  default:// 处理来自本地目录的文件,主要是一些静态资源文件,搭建静态服务器还有其他的方法
    var filename = url.pathname.substring(1);  // 去掉前导'/'
    var type = getType(filename.substring(filename.lastIndexOf('.')+1));
    console.log(filename); //取得文件类型 css  js ....
    // 异步读取文件,并将内容作为单独的数据模块传给回调函数
    // 对于确实很大的文件,使用流API fs.createReadStream()更好
    fs.readFile(filename, function(err, content){
      if(err) {
        response.writeHead(404, { 'Content-Type':'text/plain; charset="UTF-8"' });
        response.write(err.message);
        response.end();
      } else {
        response.writeHead(200, { 'Content-Type' : type });
        response.write(content);
        response.end();
      }
    });
    break;
  }   
});

//这里定义了一个用来判断文件类型的函数
function getType(endTag){
  var type=null;
  switch(endTag){
  case 'html' :
     type = 'text/html; charset=UTF-8';
    break;
  case 'htm' :
    type = 'text/html; charset=UTF-8';
    break;
  case 'js' : 
    type = 'application/javascript; charset="UTF-8"';
    break;
  case 'css' :
    type = 'text/css; charset="UTF-8"';
    break;
  case 'txt' :
    type = 'text/plain; charset="UTF-8"';
    break;
  case 'manifest' :
    type = 'text/cache-manifest; charset="UTF-8"';
    break;
  default :
    type = 'application/octet-stream';
    break;
  }
  return type;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
将nodejs打包工具整合到鼠标右键的方法
May 11 NodeJs
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
nodejs 实现模拟form表单上传文件
Jul 14 NodeJs
nodejs下打包模块archiver详解
Dec 03 NodeJs
nodejs 中模拟实现 emmiter 自定义事件
Feb 22 NodeJs
用nodejs的实现原理和搭建服务器(动态)
Aug 10 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
NodeJs通过async/await处理异步的方法
Oct 09 NodeJs
nodejs中用npm初始化来创建package.json的实例讲解
Oct 10 NodeJs
使用koa-log4管理nodeJs日志笔记的使用方法
Nov 30 NodeJs
一文秒懂nodejs中的异步编程
Jan 28 NodeJs
nodejs读写json文件的简单方法(必看)
Mar 09 #NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 #NodeJs
nodejs中全局变量的实例解析
Mar 07 #NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 #NodeJs
详解nodeJS中读写文件方法的区别
Mar 06 #NodeJs
详谈Angular路由与Nodejs路由的区别
Mar 05 #NodeJs
async/await与promise(nodejs中的异步操作问题)
Mar 03 #NodeJs
You might like
PHP面向对象编程快速入门
2006/10/09 PHP
php 不同编码下的字符串长度区分
2009/09/26 PHP
一些php项目中比较通用的php自建函数的详解
2013/06/06 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
javaScript如何处理从java后台返回的list
2014/04/24 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
js调用webservice构造SOAP进行身份验证
2016/04/27 Javascript
jQuery 插件封装的方法
2016/11/16 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
Bootstrap缩略图的创建方法
2017/03/22 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
通过python下载FTP上的文件夹的实现代码
2013/02/10 Python
Python常用的爬虫技巧总结
2016/03/28 Python
对pandas中apply函数的用法详解
2018/04/10 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
Python测试框架:pytest学习笔记
2020/10/20 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
澳大利亚排名第一的露营和户外设备在线零售商:Outbax
2020/05/06 全球购物
一篇.NET面试题
2014/09/29 面试题
浅谈react路由传参的几种方式
2021/03/23 Javascript
安全检查验收制度
2014/01/12 职场文书
打造完美自荐信
2014/01/24 职场文书
《最佳路径》教学反思
2014/04/13 职场文书
档案信息化建设方案
2014/05/16 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
2014年青年志愿者工作总结
2014/12/09 职场文书
推广普通话的宣传语
2015/07/13 职场文书