博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Connect模块解析 转载
阅读量:6406 次
发布时间:2019-06-23

本文共 6124 字,大约阅读时间需要 20 分钟。

来自对《了不起的Node.js》一书的学习

Connect
Node.js为常规的网络应用提供了基本的API。然而,实际情况下,绝大部分网络应用都需要完成一系列类似的操作,这些类似的操作你一定不想每次都重复地基于原始的API去实现。
Connect是一个基于HTTP服务器的工具集,它提供了一种新的组织代码的方式来与请求、响应对象进行交互,称为中间件(middleware)。
中间件具有代码复用的好处。
案例
  需求:实现一个后台服务,能响应浏览器请求站点目录下的images下的.jpg图片,并返回图片。

使用HTTP构建一个简单的网站

创建server.js,实现该服务器的基本功能(解析请求的URL地址,根据不同的URL请求,对应不同的操作,如:请求.jpg图片),代码如下所示:
/**
* 模块依赖
*/
var http = require('http'),
fs = require('fs');

/**

* 创建服务器
*/
var server = http.createServer(function(req, res) {
// 检查URL是否和服务器目录下的文件匹配,如果匹配,则读取该文件并展示出来
// 请求.jpg图片
if('GET' == req.method
&& '/images' == req.url.substr(0, 7)
&& '.jpg' == req.url.substr(-4)) {
// 返回对应图片
// ...

} else if('GET' == req.method && '/' == req.url) {

// 发送html文件,默认请求index.html
// ...

} else {

// 处理其他请求,返回404错误码
res.writeHead(404);
res.end('Not found');
}

});

server.listen(3000);

  接下来的任务,当然是完成处理对应的请求。
2. 首先是请求图片时,使用fs.stat来检查文件是否存在。这里使用Node中的全局常量__dirname来获取当前服务器所在的路径。在

// 返回对应图片

1
代码下,增加对应操作:

fs.stat(__dirname + req.url, function(err, stat) {

// 如果检查文件是否存在时发生错误,则终止进程并发送HTTP 404状态码告知无法找到请求的图片。
// 对于stat成功但是路径所表示的并非是文件时,也要做此处理。
if(err || !stat.isFile()) {
res.writeHead(404);
res.end('Not Found');
return;
}

// 发送图片资源

});
  接下来解决的问题是,发送图片资源或文件资源的问题,实际上也是服务器返回响应消息的问题。那么想想,如何返回呢?我们需要设置响应消息的Content-Type头信息,告诉浏览器,现在服务器将返回什么类型的数据。
3. 对于返回图片资源或文件资源的操作,区别只于在文件的路径和Content-Type头信息的不同而已,那么可以封装为如下方法:

/**

* 根据文件路径来获取文件内容,并添加'Content-Type'头信息
* @param {[type]} path 文件路径
* @param {[type]} type Content-Type头信息
* @return {[type]} [description]
*/
function server(path, type) {
res.writeHead(200, {'Content-Type': type});
fs.createReadStream(path).pipe(res);
}
  在对应 发送图片资源 的注释处,添加如下代码:

// 发送图片资源

serve(__dirname + req.url, 'application/jpg');
  在对应 发送html文件 的注释处,添加如下代码:

// 发送html文件,默认请求index.html

// ...
serve(__dirname + '/index.html', 'text/html');
  server.js完成!
4. 此外,补充一下 index.html 的内容:

<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="UTF-8">
<title>使用HTTP构建一个简单的网站</title>
<style>
img {
width: 300px;
}
</style>
</head>
<body>
<h1>My website</h1>
<img src="./images/1.jpg" alt="1.jpg">
<img src="./images/2.jpg" alt="2.jpg">
<img src="./images/3.jpg" alt="3.jpg">
<img src="./images/4.jpg" alt="4.jpg">
</body>
</html>
  简单的显示4张图片(其实对应的就是4个请求.jpg图片资源的请求)。
5. 运行 node server.js,在浏览器中访问 http://127.0.0.1:3000,就能看到刚实现的网站了!如:
  server.js的完整代码如下:

/**

* 模块依赖
*/
var http = require('http'),
fs = require('fs');

/**

* 创建服务器
*/
var server = http.createServer(function(req, res) {
// 检查URL是否和服务器目录下的文件匹配,如果匹配,则读取该文件并展示出来
// 请求.jpg图片
if('GET' == req.method
&& '/images' == req.url.substr(0, 7)
&& '.jpg' == req.url.substr(-4)) {
// 返回对应图片
// ...
fs.stat(__dirname + req.url, function(err, stat) {
// 如果检查文件是否存在时发生错误,则终止进程并发送HTTP 404状态码告知无法找到请求的图片。
// 对于stat成功但是路径所表示的并非是文件时,也要做此处理。
if(err || !stat.isFile()) {
res.writeHead(404);
res.end('Not Found');
return;
}

// 发送图片资源

serve(__dirname + req.url, 'application/jpg');
});

} else if('GET' == req.method && '/' == req.url) {

// 发送html文件,默认请求index.html
// ...
// console.log(__dirname);
serve(__dirname + '/index.html', 'text/html');
} else {
// 处理其他请求,返回404错误码
res.writeHead(404);
res.end('Not found');
}

/**
* 根据文件路径来获取文件内容,并添加'Content-Type'头信息
* @param {[type]} path 文件路径
* @param {[type]} type Content-Type头信息
* @return {[type]} [description]
*/
function serve(path, type) {
res.writeHead(200, {'Content-Type': type});
fs.createReadStream(path).pipe(res);
}
});

server.listen(3000);

通过Connect实现一个简单的网站
  接下来这个例子是要实现一个网站,该例子展示了创建网站时一些常见的任务:
  - 托管静态文件。
  - 处理错误以及损坏或者不存在的URL。
  - 处理不同类型的请求。
  基于http模块API之上的Connect,提供了一些工具方法能够让这些重复性的处理便于实现,以至于让开发者能够更加专注在应用本身。
1. 初始化项目——npm init,创建package.json文件,并在其中声明对“connect”模块的依赖:

{

"name": "my-website",
"version": "0.0.1",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"connect": "1.8.7"
}
}
  使用 npm install 命令安装依赖。
2. 在server.js中使用use()方法来添加static中间件。(中间件是什么呢?我也不清楚耶,快看到下一节了。中间件,其实就是一个简单的JavaScript函数。)

/**

* 模块依赖
*/
var connect = require('connect');

/**

* 创建服务器
*/
var server = connect.createServer();

/**

* 处理静态文件
* 这里,我们配置static中间件——通过传递一些参数给connect.static方法,该方法本身会返回一个方法
* (被返回的方法应该是中间件吧~)
*/
server.use(connect.static(__dirname + '/website'));

server.listen(3000);

  运行 node server.js(啊?这就好了?!刚写一堆,现在用了Connect模块就几行而已了?没错,是的)。试着在浏览器访问,成功见到index.html的样子了!那我们访问不存在的url呢(事实上,Connect会帮我们处理404的情况),例如,我们可以访问 /test 来验证。浏览器将显示如下结果:

Cannot GET /test

1
  注:记得把index.html 和 images文件夹等静态资源放置到项目目录下的website文件夹下。

中间件

  在没有使用中间件的情况下,处理请求的这些代码都放在一个简单的事件处理器中(createServer的回调函数中),这将会是一个非常复杂的处理过程。而使用中间件后会将应用拆分为更小单元(让代码有更强大的表达能力),还能够实现很好的重用性。
  如之前用HTTP方式所写的应用,使用中间件模式可以写成这样(当然这里也仍然需要到Connect模块啦) server-http.js:

/**

* 模块依赖
*/
var connect = require('connect');
var fs = require('fs');
var serve =
/**
* 根据文件路径来获取文件内容,并添加'Content-Type'头信息
* @param {[type]} path 文件路径
* @param {[type]} type Content-Type头信息
* @return {[type]} [description]
*/
function (res, fs, path, type) {
res.writeHead(200, {'Content-Type': type});
fs.createReadStream(path).pipe(res);
};

/**

* 创建服务器
*/
var server = connect.createServer();

server.use(function(req, res, next) {

// 检查URL是否和服务器目录下的文件匹配,如果匹配,则读取该文件并展示出来
// 请求.jpg图片
if('GET' == req.method
&& '/images' == req.url.substr(0, 7)
&& '.jpg' == req.url.substr(-4)) {
// 返回对应图片
// ...
fs.stat(__dirname + req.url, function(err, stat) {
// 如果检查文件是否存在时发生错误,则终止进程并发送HTTP 404状态码告知无法找到请求的图片。
// 对于stat成功但是路径所表示的并非是文件时,也要做此处理。
if(err || !stat.isFile()) {
res.writeHead(404);
res.end('Not Found');
return;
}

// 发送图片资源

serve(res, __dirname + '/website' + req.url, 'application/jpg');
});

} else {

// 交给其他的中间件去处理
next();
}
});

server.use(function(req, res, next) {

if('GET' == req.method && '/' == req.url) {
// 发送html文件,默认请求index.html
// ...
// console.log(__dirname);
serve(res, __dirname + '/website/index.html', 'text/html');
} else {
// 交给其他的中间件去处理
next();
}
});

server.use(function(req, res, next) {

// 处理其他请求,返回404错误码
res.writeHead(404);
res.end('Not found');
});

server.listen(3000);

---------------------
作者:梦小白
来源:CSDN
原文:https://blog.csdn.net/qq_15096707/article/details/53709721
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/xiaozhumaopao/p/10315967.html

你可能感兴趣的文章
内存管理之1:x86段式内存管理与保护模式
查看>>
20180925上课截图
查看>>
Spring学习总结(4)——Spring AOP教程
查看>>
sql经典语句大全
查看>>
SolusVM的安装使用(三)SolusVM的安装
查看>>
操作系统厂商聚焦
查看>>
java去除数组中重复元素
查看>>
一个Maven工程中,不同的模块需要不同的JDK进行编译的解决方案
查看>>
自力更生 12种方法禁用USB端口
查看>>
【51CTO学院三周年】脱胎换骨的学习成果
查看>>
innodb_fast_shutdown的内幕
查看>>
IO输入/输出流的简单总结
查看>>
JavaScript之DOM-9 HTML DOM(HTML DOM概述、常用HTML DOM对象、HTML表单)
查看>>
询表空间是否查自动扩展 tablespace / auto
查看>>
技术成长之路(一)
查看>>
中国北方国际五金城硬件选型
查看>>
JS中的作用域链
查看>>
快速回到顶部
查看>>
20160217002 微信公众平台开发接入指南
查看>>
Emmet基本使用教程
查看>>