搭建简单的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的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
Nodejs实现的一个静态服务器实例
Dec 06 NodeJs
Nodejs获取网络数据并生成Excel表格
Mar 31 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
nodejs开发——express路由与中间件
Mar 24 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
windows系统下更新nodejs版本的方案
Nov 24 NodeJs
使用npm安装最新版本nodejs
Jan 18 NodeJs
nodejs微信扫码支付功能实现
Feb 17 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
5分钟教你用nodeJS手写一个mock数据服务器的方法
Sep 10 NodeJs
NodeJS模块Buffer原理及使用方法解析
Nov 11 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/20 PHP
PHP使用get_headers函数判断远程文件是否存在的方法
2014/11/28 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
用JQuery 判断某个属性是否存在hasAttr的解决方法
2013/04/26 Javascript
浅析JavaScript中的delete运算符
2013/11/30 Javascript
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
用nodejs的实现原理和搭建服务器(动态)
2016/08/10 NodeJs
微信开发 JS-SDK 6.0.2 经常遇到问题总结
2016/12/08 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
2017/07/09 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
JS返回页面时自动回滚到历史浏览位置
2018/09/26 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
JS数组Object.keys()方法的使用示例
2019/06/05 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
基于python编写的微博应用
2014/10/17 Python
进一步了解Python中的XML 工具
2015/04/13 Python
python实现查找excel里某一列重复数据并且剔除后打印的方法
2015/05/26 Python
Python 判断是否为质数或素数的实例
2017/10/30 Python
python统计中文字符数量的两种方法
2019/01/31 Python
html5 input属性使用示例
2013/06/28 HTML / CSS
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
处理textarea中的换行和空格
2019/12/12 HTML / CSS
护理自荐信范文
2013/10/05 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
校园文明倡议书
2014/05/16 职场文书
php7中停止php-fpm服务的方法详解
2021/05/09 PHP
HTML5页面音频自动播放的实现方式
2021/06/21 HTML / CSS
Python进程间的通信之语法学习
2022/04/11 Python
总结三种用 Python 作为小程序后端的方式
2022/05/02 Python