搭建简单的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的url截取模块url-extract的使用实例
Nov 18 NodeJs
跟我学Nodejs(二)--- Node.js事件模块
May 21 NodeJs
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
Aug 03 NodeJs
NodeJS创建基础应用并应用模板引擎
Apr 12 NodeJs
Nodejs 发送Post请求功能(发短信验证码例子)
Feb 09 NodeJs
深入解析nodejs HTTP服务
Jul 25 NodeJs
nodejs判断文件、文件夹是否存在及删除的方法
Nov 10 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs读取本地中文json文件出现乱码解决方法
Oct 10 NodeJs
Nodejs处理异常操作示例
Dec 25 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 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
一个用php3编写的简单计数器
2006/10/09 PHP
php 301转向实现代码
2008/09/18 PHP
WordPress分页伪静态加html后缀
2016/06/08 PHP
JS Array对象入门分析
2008/10/30 Javascript
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
2017/01/21 Javascript
bootstrapValidator 重新启用提交按钮的方法
2017/02/20 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
js实现简单模态框实例
2018/11/16 Javascript
更强大的vue ssr实现预取数据的方式
2019/07/19 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
详解从vue-loader源码分析CSS Scoped的实现
2019/09/23 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
浅析Python中的多条件排序实现
2016/06/07 Python
Python找出最小的K个数实例代码
2018/01/04 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python使用udp实现聊天器功能
2018/12/10 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
Django REST 异常处理详解
2020/07/15 Python
python3.7调试的实例方法
2020/07/21 Python
python 贪心算法的实现
2020/09/18 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
如何将字串String转换成整数int
2015/02/21 面试题
介绍一下mysql的日期和时间函数
2013/03/28 面试题
大学班级计划书
2014/04/29 职场文书
我的生日感言
2015/08/03 职场文书
golang在GRPC中设置client的超时时间
2021/04/27 Golang
Django框架之路由用法
2022/06/10 Python