node.js(八) 有趣的东西才开始哦

### Express介绍

npm提供了大量的第三方模块,其中不乏许多Web框架,比如我们本章节要讲述的一个轻量级的Web框架 ——— Express。

Express是一个简洁、灵活的node.js Web应用开发框架, 它提供一系列强大的功能,比如:模板解析、静态文件服务、中间件、路由控制等等,并且还可以使用插件或整合其他模块来帮助你创建各种 Web和移动设备应用,是目前最流行的基于Node.js的Web开发框架,并且支持Ejs、jade等多种模板,可以快速地搭建一个具有完整功能的网 站。

好,下面我们就开始吧!

  1. NPM安装
  1. npm install express
  1. 获取、引用
  1. var express = require(‘express‘);
  2. var app = express();

### 创建应用

认识了Express框架,我们开始创建我们的第一个express应用。

在我们的默认项目主文件app.js添加如下内容:

  1. var express = require(‘express‘);
  2. var app = express();
  3. app.get(‘/‘, function (request, response) {
  4. response.send(‘Hello World!‘);
  5. });
  6. app.listen(80);

永远的最爱,看到这个你就建好了一个express

注:上面listen(80)里的80是Internet 信息服务的管理单元提供 Web 连接和管理。还有其他端口,我会分享篇文章,有兴趣可以看看。

### get请求

前面我们实现了一个简单的express应用,下面我们就开始具体讲述它的具体实现,首先我们先来学习Express的常用方法。

get方法 —— 根据请求路径来处理客户端发出的GET请求。

格式:app.get(path,function(request, response));

path为请求的路径,第二个参数为处理请求的回调函数,有两个参数分别是request和response,代表请求信息和响应信息。

如下示例:

  1. var express = require(‘express‘);
  2. var app = express();
  3. app.get(‘/‘, function(request, response) {
  4. response.send(‘Welcome to the homepage!‘);
  5. });
  6. app.get(‘/about‘, function(request, response) {
  7. response.send(‘Welcome to the about page!‘);
  8. });
  9. app.get("*", function(request, response) {
  10. response.send("404 error!");
  11. });
  12. app.listen(80);

上面示例中,指定了about页面路径、根路径和所有路径的处理方法。并且在回调函数内部,使用HTTP回应的send方法,表示向浏览器发送一个字符串。

效果:

### Middleware<中间件>

1.什么是中间件?

中间件(middleware)就是处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、分析数据、以及其他在需要最终将数据发送给用户之前完成的任务。 它最大的特点就是,一个中间件处理完,可以把相应数据再传递给下一个中间件。

2.一个不进行任何操作、只传递request对象的中间件,大概是这样:

  1. function Middleware(request, response, next) {
  2. next();
  3. }

上面代码的next为中间件的回调函数。如果它带有参数,则代表抛出一个错误,参数为错误文本。

  1. function Middleware(request, response, next) {
  2. next(‘出错了!‘);
  3. }

抛出错误以后,后面的中间件将不再执行,直到发现一个错误处理函数为止。如果没有调用next方法,后面注册的函数也是不会执行的。

### all函数的基本用法

和get函数不同app.all()函数可以匹配所有的HTTP动词,也就是说它可以过滤所有路径的请求,如果使用all函数定义中间件,那么就相当于所有请求都必须先通过此该中间件。

格式:app.all(path,function(request, response));

如下所示,我们使用all函数在请求之前设置响应头属性。

  1. var express = require("express");
  2. var app = express();
  3. app.all("*", function(request, response, next) {
  4. response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); //设置响应头属性值
  5. next();
  6. });
  7. app.get("/", function(request, response) {
  8. response.end("欢迎来到首页!");
  9. });
  10. app.get("/about", function(request, response) {
  11. response.end("欢迎来到about页面!");
  12. });
  13. app.get("*", function(request, response) {
  14. response.end("404 - 未找到!");
  15. });
  16. app.listen(80);

上面代码参数中的“*”表示对所有路径有效,这个方法在给特定前缀路径或者任意路径上处理时会特别有用,不管我们请求任何路径都会事先经过all函数。

效果:

可以试试把charset=utf-8这个去掉看看会发生什么。

### use基本用法1

use是express调用中间件的方法,它返回一个函数。

格式:app.use([path], function(request, response, next){});

//可选参数path默认为"/"。

  1. 使用中间件
  1. app.use(express.static(path.join(__dirname, ‘/‘)));

如上呢,我们就使用use函数调用express中间件设定了静态文件目录的访问路径(这里假设为根路径)。

  1. 如何连续调用两个中间件呢,如下示例:
  1. var express = require(‘express‘);
  2. var app = express();
  3. app.use(function(request, response, next){
  4. console.log("method:"+request.method+" ==== "+"url:"+request.url);
  5. next();
  6. });
  7. app.use(function(request, response){
  8. response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
  9. response.end(‘示例:连续调用两个中间件‘);
  10. });
  11. app.listen(80);

回调函数的next参数,表示接受其他中间件的调用,函数体中的next(),表示将请求数据传递给下一个中间件。

上面代码先调用第一个中间件,在控制台输出一行信息,然后通过next(),调用第二个中间件,输出HTTP回应。由于第二个中间件没有调用next方法,所以req对象就不再向后传递了。

### use基本用法2

use方法不仅可以调用中间件,还可以根据请求的网址,返回不同的网页内容,如下示例:

  1. var express = require("express");
  2. var app = express();
  3. app.use(function(request, response, next) {
  4. if(request.url == "/") {
  5. response.send("Welcome to the homepage!");
  6. }else {
  7. next();
  8. }
  9. });
  10. app.use(function(request, response, next) {
  11. if(request.url == "/about") {
  12. response.send("Welcome to the about page!");
  13. }else {
  14. next();
  15. }
  16. });
  17. app.use(function(request, response) {
  18. response.send("404 error!");
  19. });
  20. app.listen(80);

上面代码通过request.url属性,判断请求的网址,从而返回不同的内容。

### 回调函数

Express回调函数有两个参数,分别是request(简称req)和response(简称res),request代表客户端发来的HTTP请求,response代表发向客户端的HTTP回应,这两个参数都是对象。示例如下:

  1. function(req, res) {
  2. });

### 获取主机名、路径名

今天我们就先来学习如何使用req对象来处理客户端发来的HTTP请求。

  1. req.host返回请求头里取的主机名(不包含端口号)。
  2. req.path返回请求的URL的路径名。

如下示例:

  1. var express = require(‘express‘);
  2. var app = express();
  3. app.get("*", function(req, res) {
  4. console.log(req.path);
  5. res.send("req.host获取主机名,req.path获取请求路径名!");
  6. });
  7. app.listen(80);

### query基本用法

query是一个可获取客户端get请求路径参数的对象属性,包含着被解析过的请求参数对象,默认为{}。

  1. var express = require(‘express‘);
  2. var app = express();
  3. app.get("*", function(req, res) {
  4. console.log(req.query.参数名);
  5. res.send("测试query属性!");
  6. });
  7. app.listen(80);

通过req.query获取get请求路径的对象参数值。

格式:req.query.参数名;请求路径如下示例:

例1: /search?n=Lenka

  1. req.query.n // "Lenka"

例2: /shoes?order=desc&shoe[color]=blue&shoe[type]=converse

  1. req.query.order // "desc"
  2. req.query.shoe.color // "blue"
  3. req.query.shoe.type // "converse"

### param基本用法

和属性query一样,通过req.param我们也可以获取被解析过的请求参数对象的值。

格式:req.param("参数名");请求路径如下示例:

例1: 获取请求根路径的参数值,如/?n=Lenka,方法如下:

  1. var express = require(‘express‘);
  2. var app = express();
  3. app.get("/", function(req, res) {
  4. console.log(req.param("n")); //Lenka
  5. res.send("使用req.param属性获取请求根路径的参数对象值!");
  6. });
  7. app.listen(80);

例2:我们也可以获取具有相应路由规则的请求对象,假设路由规则为 /user/:name/,请求路径/user/mike,如下:

  1. app.get("/user/:name/", function(req, res) {
  2. console.log(req.param("name")); //mike
  3. res.send("使用req.param属性获取具有路由规则的参数对象值!");
  4. });

PS:所谓“路由”,就是指为不同的访问路径,指定不同的处理方法。

### params基本用法

和param相似,但params是一个可以解析包含着有复杂命名路由规则的请求对象的属性。

格式:req.params.参数名;

例1. 如上课时请求根路径的例子,我们就可以这样获取,如下:

  1. var express = require(‘express‘);
  2. var app = express();
  3. app.get("/user/:name/", function(req, res) {
  4. console.log(req.params.name); //mike
  5. res.send("使用req.params属性获取具有路由规则的参数对象值!");
  6. });
  7. app.listen(80);

查看运行结果,和param属性功能是一样的,同样获取name参数值。

例2:当然我们也可以请求复杂的路由规则,如/user/:name/:id,假设请求地址为:/user/mike/123,如下:

  1. app.get("/user/:name/:id", function(req, res) {
  2. console.log(req.params.id); //"123"
  3. res.send("使用req.params属性复杂路由规则的参数对象值!");
  4. });

### send基本用法

send()方法向浏览器发送一个响应信息,并可以智能处理不同类型的数据。格式如下:

  1. res.send([body|status], [body]);

1.当参数为一个String时,Content-Type默认设置为"text/html"。

  1. res.send(‘Hello World‘); //Hello World

2.当参数为Array或Object时,Express会返回一个JSON。

  1. res.send({ user: ‘tobi‘ }); //{"user":"tobi"}
  2. res.send([1,2,3]); //[1,2,3]

3.当参数为一个Number时,并且没有上面提到的任何一条在响应体里,Express会帮你设置一个响应体,比如:200会返回字符"OK"。

  1. res.send(200); // OK
  2. res.send(404); // Not Found
  3. res.send(500); // Internal Server Error

send方法在输出响应时会自动进行一些设置,比如HEAD信息、HTTP缓存支持等等。

这些可以去汇智网去学习!

时间: 2024-11-03 20:48:01

node.js(八) 有趣的东西才开始哦的相关文章

Node.js(八)——HTTP性能测试

使用Apache 下的ab进行测试 按照:Apache ab(压力测试工具)教程参考如下: http://blog.csdn.net/ahaaaaa/article/details/51514175 编译版本安装与配置: http://www.cnblogs.com/gsls200808/p/4506301.html msi:版本下载 http://archive.apache.org/dist/httpd/binaries/win32/ ad完全可以模拟各种条件下对web服务器发起的测试请求,

NODE.JS之我见

NODE.JS之我见 先说说为什么有这篇文章,关注NODE.JS 也有一段时间了,不敢说大彻大悟,但是对于NODE.JS能干什么,还是有一定的了解,笔者多年以前就研究过JavaScript引擎V8,可以说是国内最早编译并研究V8代码的人之一,这一点有博客为证.虽然NODE.JS的成功是有目共睹的,在社区的火爆程度也是路人皆知的,但是从笔者的角度来看,NODE.JS并没有给计算机科学带来任何的新东西,对于我来说它也并没有任何的新意,对于这一点,笔者并不愿意挑起任何的争论,但是欢迎讨论,也欢迎不同的

Node.js 教程 05 - EventEmitter(事件监听/发射器 )

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会

node.js 事件发射器模式

目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEmitter 前言: 今天事儿太多了,没有发太多的东西.不好意思了各位. 本篇主要介绍Node.js中的事件驱动,至于Node.js事件概念的东西,太多了. 本系列课程主要抱着的理念就是,让大家慢慢的入门,我也尽量写的简单一点. 所以呢,本文事件驱动,大家的目标应该是:理解Node.js的事件驱动.会

Node.js安装记录

Node.js安装及环境配置之Windows篇 安装 Node.js 的时候会自动安装 npm ,并且 npm 就是 Node.js 的包管理工具(node package manager 的缩写). 参考:https://www.npmjs.com/about 所以,安装Node.js默认就会安装npm,安装npm最简单的方式就是安装node. 参考:https://docs.npmjs.com/downloading-and-installing-node-js-and-npm#using-

Node.js学习-1

关于node.js 首先,node.js不是一门语言,是一个平台.因为在以前,javascript主要是用于网页的交互,所以必须依附于浏览器存在,只有在浏览器上才能运行javascript. 后来javascript的使用者越来越多,ECMAscript的标准也逐渐完善,功能越来越多,有人就想用javascript来写后端一统天下做一个全盏工程师,于是就出现node.js了.Node.js是集成了Google v8引擎来执行代码,而且大部分的模块都是用javascript来写的.这使得javas

Node.js安装及环境配置之Windows篇

一.安装环境 1.本机系统:Windows 10 Pro(64位)2.Node.js:v6.9.2LTS(64位) 二.安装Node.js步骤 1.下载对应你系统的Node.js版本:https://nodejs.org/en/download/2.选安装目录进行安装3.环境配置4.测试 三.前期准备 1.Node.js简介简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境.Node.js 使

高性能Web服务端 PHP vs Node.js vs Nginx-Lua 的对比分析

1. ngx_lua nodejs php 比较 我在研究一阵子ngx_lua之后发现lua语法和js真的很像,同时ngx_lua模型也是单线程的异步的事件驱动的,工作原理和nodejs相同,代码甚至比nodejs的异步回调更好写一些. 性能测试,100并发php:17400nodejs:31197ngx_lua:32628 单纯做http代理服务器加上一些简单的逻辑,似乎ngx_lua的方案更加合适. 引自: PHP vs Node.js vs Nginx-Lua 以下是从占用的资源上来分析:

用Node.js 将bugzilla上的bug列表导入到excel表格里

公司用bugzilla管理产品bug,最近用Node.js做了个东西,方便能够把bug的相关信息导入到excel表格里,好做后续的管理分析. 直接贴代码,写上注释好了.转载请注明出处. var request = require("request") var cheerio = require("cheerio"); var Excel = require('exceljs'); var colors = require("colors"); v