搭建简单的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中自定义事件实例
Jun 20 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 NodeJs
nodejs6下使用koa2框架实例
May 18 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
nodejs+mongodb aggregate级联查询操作示例
Mar 17 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
详解NodeJS模块化
Jun 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学习 函数 课件
2008/06/15 PHP
php 文件上传类代码
2011/08/06 PHP
php中的filesystem文件系统函数介绍及使用示例
2014/02/13 PHP
php中session定期自动清理的方法
2015/11/12 PHP
PHP实现冒泡排序的简单实例
2016/05/26 PHP
在Laravel5中正确设置文件权限的方法
2019/05/22 PHP
Extjs 继承Ext.data.Store不起作用原因分析及解决
2013/04/15 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
2015/11/23 Javascript
AngularJS中的指令全面解析(必看)
2016/05/20 Javascript
详解JavaScript中双等号引起的隐性类型转换
2016/05/30 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
AngularJS Select(选择框)使用详解
2017/01/18 Javascript
javascript实现简易计算器
2017/02/01 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
详解JavaScript的数据类型以及数据类型的转换
2019/04/20 Javascript
原生js实现日历效果
2020/03/02 Javascript
[16:43]Heroes19_剃刀(完美)
2014/10/31 DOTA
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
python selenium登录豆瓣网过程解析
2019/08/10 Python
python实现的Iou与Giou代码
2020/01/18 Python
python 爬虫基本使用——统计杭电oj题目正确率并排序
2020/10/26 Python
html5唤起app的方法
2017/11/30 HTML / CSS
快速创建 HTML5 Canvas 电信网络拓扑图的示例代码
2018/03/21 HTML / CSS
美国购车网站:TrueCar
2016/10/19 全球购物
简单说说tomcat的配置
2013/05/28 面试题
《在山的那边》教学反思
2014/02/23 职场文书
应聘编辑自荐信范文
2014/03/12 职场文书
歌颂祖国的演讲稿
2014/05/04 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
2015双创工作总结
2015/07/24 职场文书
2015教师个人年度工作总结
2015/10/23 职场文书
幽默口才训练经典句子(48句)
2019/08/19 职场文书
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技