搭建简单的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教程之异步I/O
Nov 21 NodeJs
轻松创建nodejs服务器(1):一个简单nodejs服务器例子
Dec 18 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
Nodejs学习笔记之NET模块
Jan 13 NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 NodeJs
Nodejs多站点切换Htpps协议详解及简单实例
Feb 23 NodeJs
实例分析nodejs模块xml2js解析xml过程中遇到的坑
Mar 18 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
nodejs更新package.json中的dependencies依赖到最新版本的方法
Oct 10 NodeJs
Nodejs中获取当前函数被调用的行数及文件名详解
Dec 12 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
在nodejs中创建child process的方法
Jan 26 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音乐采集(部分代码)
2007/02/14 PHP
深入分析php中接口与抽象类的区别
2013/06/08 PHP
使用PHP编写发红包程序
2015/07/22 PHP
php生成二维码
2015/08/10 PHP
php关闭warning问题的解决方法
2016/05/17 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
用JavaScript和注册表脚本实现右键收藏Web页选中文本
2007/01/28 Javascript
ArrayList类(增强版)
2007/04/04 Javascript
详细讲解JS节点知识
2010/01/31 Javascript
javascript 节点遍历函数
2010/03/28 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
微信小程序收藏功能的实现代码
2018/06/12 Javascript
vue ssr 实现方式(学习笔记)
2019/01/18 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
python 从远程服务器下载东西的代码
2013/02/10 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
pytorch 数据集图片显示方法
2018/07/26 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
pyqt5中动画的使用详解
2020/04/01 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
业务经理岗位职责
2013/11/11 职场文书
幼儿园教师国培感言
2014/02/02 职场文书
管理岗位竞聘演讲稿
2014/08/18 职场文书
魂断蓝桥观后感
2015/06/10 职场文书
python数据分析之单因素分析线性拟合及地理编码
2022/06/25 Python
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers