1、 Node.js 创建的第一个应用

 1、引入http模块

var http = require("http");

2、 创建服务器
接下来我们使用 http.createServer() 方法创建服务器,并使用 listen 方法绑定 8888 端口。函数通过 request, response 参数来接收和响应数据。

//1.引入 http 模块
var http=require('http');
//2.用 http 模块创建服务
http.createServer(function(req,res){
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
//设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf-8
res.writeHead(200,{"Content-Type":"text/html;charset='utf-8'"});
res.write('你好 nodejs');
res.write('我是第一个 nodejs 程序');
res.end(); /*结束响应*/
}).listen(8001);

  

   2WEB 服务器介绍
Web 服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等 Web 客户端提供文档, 也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个 Web 服务器是 Apache 、 Nginx 、IIS

3Nodejs 封装一个 WEB 服务器

启动
node start
功能
* 能显示以 `.html/.htm` 结尾的 Web 页面

* 能直接打开以 `.js/.css/.json/.text` 结尾的文件内容

* 显示图片资源

* 自动下载以 `.apk/.docx/.zip` 结尾的文件

* 形如 `http://xxx.com/a/b/` , 则查找b目录下是否有 `index.html`,如果有就显示,如果没有就列出该目录下的所有文件及文件夹,并可以进一步访问。

* 形如 `http://xxx.com/a/b`,  则作301重定向到 `http://xxx.com/a/b/` , 这样可以解决内部资源引用错位的问题。

HttpServer.js

module.exports = (function () {

  "use strict";

  console.time('[HttpServer][Start]');

  //http协议模块
var http = require('http');
//url解析模块
var url = require('url');
//文件系统模块
var fs = require("fs");
//路径解析模块
var path = require("path"); return {
//启动服务
start: function () {
var port = this.config.port;
var ip = this.config.ip; //创建一个服务
var httpServer = http.createServer(this.processRequest.bind(this)); //在指定的端口监听服务
httpServer.listen(port, function () {
console.log("[HttpServer][Start]", "runing at http://" + ip + ":" + port + "/");
console.timeEnd("[HttpServer][Start]");
}); httpServer.on("error", function (error) {
console.error(error);
});
}, /**
* 请求处理
* @param request
* @param response
*/
processRequest: function (request, response) {
var hasExt = true;
var requestUrl = request.url;
var pathName = url.parse(requestUrl).pathname; //对请求的路径进行解码,防止中文乱码
pathName = decodeURI(pathName); //如果路径中没有扩展名
if ((pathName) === '') {
//如果不是以/结尾的,加/并作301重定向
if (pathName.charAt(pathName.length - 1) != "/") {
pathName += "/";
var redirect = "http://" + request.headers.host + pathName;
response.writeHead(301, {
location: redirect
});
response.end();
return; //fix bug: 执行301重定向后应终止后续流程,以防 "write after end" 异常
}
//添加默认的访问页面,但这个页面不一定存在,后面会处理
pathName += "index.html";
hasExt = false; //标记默认页面是程序自动添加的
} //获取资源文件的相对路径
var filePath = path.join("http/webroot", pathName); //获取对应文件的文档类型
var contentType = this.getContentType(filePath); //如果文件名存在
fs.exists(filePath, function (exists) {
if (exists) {
response.writeHead(200, {"content-type": contentType});
var stream = fs.createReadStream(filePath, {flags: "r", encoding: null});
stream.on("error", function () {
response.writeHead(500, {"content-type": "text/html"});
response.end("<h1>500 Server Error</h1>");
});
//返回文件内容
stream.pipe(response);
} else { //文件名不存在的情况
if (hasExt) {
//如果这个文件不是程序自动添加的,直接返回404
response.writeHead(404, {"content-type": "text/html"});
response.end("<h1>404 Not Found</h1>");
} else {
//如果文件是程序自动添加的且不存在,则表示用户希望访问的是该目录下的文件列表
var html = "<head><meta charset='utf-8'></head>"; try {
//用户访问目录
var filedir = filePath.substring(0, filePath.lastIndexOf('\\'));
//获取用户访问路径下的文件列表
var files = fs.readdirSync(filedir);
//将访问路径下的所以文件一一列举出来,并添加超链接,以便用户进一步访问
for (var i in files) {
var filename = files[i];
html += "<div><a href='" + filename + "'>" + filename + "</a></div>";
}
} catch (e) {
html += "<h1>您访问的目录不存在</h1>"
}
response.writeHead(200, {"content-type": "text/html"});
response.end(html);
}
}
});
}, /**
* 获取文档的内容类型
* @param filePath
* @returns {*}
*/
getContentType: function (filePath) {
var contentType = this.config.mime;
var ext = path.extname(filePath).substr(1);
if (contentType.hasOwnProperty(ext)) {
return contentType[ext];
} else {
return contentType.default;
}
}, ///配置信息
config: {
port: 8888,
ip: '127.0.0.1',
mime: {
html: "text/html",
js: "text/javascript",
css: "text/css",
gif: "image/gif",
jpg: "image/jpeg",
png: "image/png",
ico: "image/icon",
txt: "text/plain",
json: "application/json",
default: "application/octet-stream"
}
}
}
})();

start.js

var http = require('./http/HttpServer');
http.start();

源代码

 

Node.js学习笔记(五) --- 使用Node.js搭建Web服务器的更多相关文章

  1. Node.js学习笔记(4)——除了HTTP(服务器和客户端)部分

    很多node入门的书里面都会在介绍node特性的时候说:单线程,异步式I/O,事件驱动. Node不是一门语言,它是运行在服务器端的开发平台,官方指定语言为javascript. 阻塞和线程: 线程在 ...

  2. ArcGIS JS 学习笔记1 用ArcGIS JS 实现仿百度地图的距离量测和面积量测

    一.开篇 在博客注册了三年,今天才决定写第一篇博客,警告自己不要懒!!! 二.关于ArcGIS JS 版本选择 在写这篇博客时ArcGIS JS 4.0正式版已经发布.它和3.x版本的不同是,Map不 ...

  3. Node.js 学习(五)Node.js 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...

  4. JS学习笔记 (五) 函数进阶

    1.函数基础 1.1 函数的基本概念 函数是一段JavaScript代码,只被定义一次,但是可以被调用或者执行许多次.函数是一种对象,可以设置属性,或调用方法. 函数中的参数分为实参和形参.其中,形参 ...

  5. js学习笔记第一课(js基础知识)

    1.js代码在浏览器中执行. 2.js代码直接插入网页中需包含在 <script language="javascript"> js代码 </script> ...

  6. 【JS学习笔记】第一个JS效果——鼠标提示框

    分析效果实现原理--鼠标提示框 样式:div的display 事件:onmouseover,onmouseout 编写JS的流程 布局:HTML+CSS 属性:确定需要修改哪些属性 事件:确定用户做哪 ...

  7. JS学习笔记(一)JS处理JSON数据

    [摘抄]将JSON字符串转换为json对象的方法.在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如:J ...

  8. cube.js 学习(五)cube.js joins 说明

      cube.js 也支持join, 参考格式 joins: { TargetCubeName: { relationship: `belongsTo` || `hasMany` || `hasOne ...

  9. JS学习笔记(4)--js变量的生命周期

    http://www.cnblogs.com/williamxiao/p/3499973.html 最近看国外经典教材的时候发现JavaScript与熟知的Java,C,C++都不同的特性,其中一个就 ...

随机推荐

  1. jQuery判断表单input

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. [转] Linux 中提高 VsFTP 服务器的安全性

    FTP是互联网应用中的一个元老级人物了,其方便企业用户文件的共享.但是,安全问题也一直伴随在FTP左右.如何防止攻击者通过非法手段窃取FTP服务器中的重要信息;如何防止攻击者利用FTP服务器来传播木马 ...

  3. css加载顺序

    最近发现个有意思的事情,印象中的是css中class后面会覆盖前面的, 于是写了代码 div{ width: 100px; height: 100px; } .red{ background-colo ...

  4. [原创] Laravel 启动流程

    目录 1. 程序启动准备 1.1 容器基础配置 1.2 核心类绑定 1.3 实例化 Http 核心类 2. 请求实例化 3. 请求处理 3.1 请求处理环境初始化 1. 环境监测 \Illuminat ...

  5. 故障排查-linux命令测试端口连通性

    方法一:telnet法 预置条件:安装telnet step 1.rpm -qa telnet-server(无输出表示telnet-server未安装,则执行step2:否则执行step3) ste ...

  6. yolov3源码分析keras(二)损失函数计算

    一.前言 损失函数计算主要分析两部分一部分是yolo_head函数的分析另一部分为ignore_mask的生成的分析. 二.重要细节分析 2.1损失函数计算具体代码及部分分析 def yolo_los ...

  7. 123th LeetCode Weekly Contest Add to Array-Form of Integer

    For a non-negative integer X, the array-form of X is an array of its digits in left to right order.  ...

  8. Effective C++ 改善55个方法

    美·Scott Meyers 候捷 电子工业 2011 刚才看到个会议时间有点晚,3.25论文都提交了 谷歌去广告的插件, 最后投了这个会议,刚刚好正合适.我说金钱与时间 ACCUSTOMING YO ...

  9. JVM 统计监测命令

    参考 深入理解JVM(七)——性能监控工具 JVM性能调优监控工具专题一 JVM调优总结 + jstat 分析 1. 进入 jdk 目录 cd /usr/local/jdk/bin 2. 查询所有 j ...

  10. Django get_object ,get_queryset方法

    Django提供了很多通用的基于类的视图(Class Based View),可以帮我们简化执行以下操作的代码.这些基于类的视图还提供了get_queryset, get_context_data和g ...