搭建简单的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 相关文章推荐
PHPStorm 2020.1 调试 Nodejs的多种方法详解
Sep 17 NodeJs
nodejs的require模块(文件模块/核心模块)及路径介绍
Jan 14 NodeJs
nodeJs内存泄漏问题详解
Sep 05 NodeJs
nodejs中sleep功能实现暂停几秒的方法
Jul 12 NodeJs
Nodejs实现文件上传的示例代码
Sep 26 NodeJs
nodejs实现截取上传视频中一帧作为预览图片
Dec 10 NodeJs
nodejs结合socket.io实现websocket通信功能的方法
Jan 12 NodeJs
详解Nodejs内存治理
May 13 NodeJs
基于nodejs res.end和res.send的区别
May 14 NodeJs
nodejs 使用nodejs-websocket模块实现点对点实时通讯
Nov 28 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
nodejs环境使用Typeorm连接查询Oracle数据
Dec 05 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字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
php生成RSS订阅的方法
2015/02/13 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
PHP使用数组依次替换字符串中匹配项
2016/01/08 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
JavaScript高级程序设计
2006/12/29 Javascript
javascript 表单的友好用户体现
2009/01/07 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
js限制文本框只能输入中文的方法
2015/08/11 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
Vue 全家桶实现移动端酷狗音乐功能
2018/11/16 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
vue实现树形结构样式和功能的实例代码
2019/10/15 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
Python使用MySQLdb for Python操作数据库教程
2014/10/11 Python
python3 flask实现文件上传功能
2020/03/20 Python
用python标准库difflib比较两份文件的异同详解
2018/11/16 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
python3调用windows dos命令的例子
2019/08/14 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
2014厂务公开实施方案
2014/02/17 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
护士个人总结范文
2015/02/13 职场文书
公司财务部岗位职责
2015/04/14 职场文书
2019XX公司员工考核管理制度!
2019/08/07 职场文书
用 Python 元类的特性实现 ORM 框架
2021/05/19 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
js判断两个数组相等的5种方法
2022/05/06 Javascript
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL