搭建简单的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实现的一个静态服务器实例
Dec 06 NodeJs
nodejs实现获取某宝商品分类
May 28 NodeJs
Nodejs实现短信验证码功能
Feb 09 NodeJs
Nodejs读取文件时相对路径的正确写法(使用fs模块)
Apr 27 NodeJs
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
May 13 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
nodejs 子进程正确的打开方式
Jul 03 NodeJs
nodejs简单访问及操作mysql数据库的方法示例
Mar 15 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
Nodejs实现爬虫抓取数据实例解析
Jul 05 NodeJs
NodeJs crypto加密制作token的实现代码
Nov 15 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 高级课程笔记 面向对象
2009/06/21 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
2010/10/19 PHP
php获取文件名称和扩展名的方法
2017/02/07 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
JavaScript 学习历程和心得分享
2010/12/12 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
通过实例理解javascript中没有函数重载的概念
2015/06/03 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
JQuery实现DIV其他动画效果的简单实例
2016/09/18 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
Vue.directive自定义指令的使用详解
2017/03/10 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Django使用Mysql数据库已经存在的数据表方法
2018/05/27 Python
django传值给模板, 再用JS接收并进行操作的实例
2018/05/28 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Django添加feeds功能的示例
2018/08/07 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
python如何基于redis实现ip代理池
2020/01/17 Python
查看keras的默认backend实现方式
2020/06/19 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
Html5之webcoekt播放JPEG图片流
2020/09/22 HTML / CSS
大学生收银员求职信分享
2014/01/02 职场文书
教师个人剖析材料
2014/02/05 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2015年卫生监督工作总结
2015/05/21 职场文书
元旦主持词开场白
2015/05/29 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
nginx实现多geoserver服务的负载均衡
2022/05/15 Servers
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python