node.js(八) 有趣的东西才开始哦
npm提供了大量的第三方模块,其中不乏许多Web框架,比如我们本章节要讲述的一个轻量级的Web框架 ——— Express。
Express是一个简洁、灵活的node.js Web应用开发框架, 它提供一系列强大的功能,比如:模板解析、静态文件服务、中间件、路由控制等等,并且还可以使用插件或整合其他模块来帮助你创建各种 Web和移动设备应用,是目前最流行的基于Node.js的Web开发框架,并且支持Ejs、jade等多种模板,可以快速地搭建一个具有完整功能的网 站。
好,下面我们就开始吧!
- NPM安装
- npm install express
- 获取、引用
- var express = require('express');
- var app = express();
认识了Express框架,我们开始创建我们的第一个express应用。
在我们的默认项目主文件app.js添加如下内容:
- var express = require('express');
- var app = express();
- app.get('/', function (request, response) {
- response.send('Hello World!');
- });
- app.listen(80);
永远的最爱,看到这个你就建好了一个express
注:上面listen(80)里的80是Internet 信息服务的管理单元提供 Web 连接和管理。还有其他端口,我会分享篇文章,有兴趣可以看看。
前面我们实现了一个简单的express应用,下面我们就开始具体讲述它的具体实现,首先我们先来学习Express的常用方法。
get方法 —— 根据请求路径来处理客户端发出的GET请求。
格式:app.get(path,function(request, response));
path为请求的路径,第二个参数为处理请求的回调函数,有两个参数分别是request和response,代表请求信息和响应信息。
如下示例:
- var express = require('express');
- var app = express();
- app.get('/', function(request, response) {
- response.send('Welcome to the homepage!');
- });
- app.get('/about', function(request, response) {
- response.send('Welcome to the about page!');
- });
- app.get("*", function(request, response) {
- response.send("404 error!");
- });
- app.listen(80);
上面示例中,指定了about页面路径、根路径和所有路径的处理方法。并且在回调函数内部,使用HTTP回应的send方法,表示向浏览器发送一个字符串。
效果:
1.什么是中间件?
中间件(middleware)就是处理HTTP请求的函数,用来完成各种特定的任务,比如检查用户是否登录、分析数据、以及其他在需要最终将数据发送给用户之前完成的任务。 它最大的特点就是,一个中间件处理完,可以把相应数据再传递给下一个中间件。
2.一个不进行任何操作、只传递request对象的中间件,大概是这样:
- function Middleware(request, response, next) {
- next();
- }
上面代码的next为中间件的回调函数。如果它带有参数,则代表抛出一个错误,参数为错误文本。
- function Middleware(request, response, next) {
- next('出错了!');
- }
抛出错误以后,后面的中间件将不再执行,直到发现一个错误处理函数为止。如果没有调用next方法,后面注册的函数也是不会执行的。
和get函数不同app.all()函数可以匹配所有的HTTP动词,也就是说它可以过滤所有路径的请求,如果使用all函数定义中间件,那么就相当于所有请求都必须先通过此该中间件。
格式:app.all(path,function(request, response));
如下所示,我们使用all函数在请求之前设置响应头属性。
- var express = require("express");
- var app = express();
- app.all("*", function(request, response, next) {
- response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }); //设置响应头属性值
- next();
- });
- app.get("/", function(request, response) {
- response.end("欢迎来到首页!");
- });
- app.get("/about", function(request, response) {
- response.end("欢迎来到about页面!");
- });
- app.get("*", function(request, response) {
- response.end("404 - 未找到!");
- });
- app.listen(80);
上面代码参数中的“*”表示对所有路径有效,这个方法在给特定前缀路径或者任意路径上处理时会特别有用,不管我们请求任何路径都会事先经过all函数。
效果:
可以试试把charset=utf-8这个去掉看看会发生什么。
use是express调用中间件的方法,它返回一个函数。
格式:app.use([path], function(request, response, next){});
//可选参数path默认为"/"。
- 使用中间件
- app.use(express.static(path.join(__dirname, '/')));
如上呢,我们就使用use函数调用express中间件设定了静态文件目录的访问路径(这里假设为根路径)。
- 如何连续调用两个中间件呢,如下示例:
- var express = require('express');
- var app = express();
- app.use(function(request, response, next){
- console.log("method:"+request.method+" ==== "+"url:"+request.url);
- next();
- });
- app.use(function(request, response){
- response.writeHead(200, { "Content-Type": "text/html;charset=utf-8" });
- response.end('示例:连续调用两个中间件');
- });
- app.listen(80);
回调函数的next参数,表示接受其他中间件的调用,函数体中的next(),表示将请求数据传递给下一个中间件。
上面代码先调用第一个中间件,在控制台输出一行信息,然后通过next(),调用第二个中间件,输出HTTP回应。由于第二个中间件没有调用next方法,所以req对象就不再向后传递了。
use方法不仅可以调用中间件,还可以根据请求的网址,返回不同的网页内容,如下示例:
- var express = require("express");
- var app = express();
- app.use(function(request, response, next) {
- if(request.url == "/") {
- response.send("Welcome to the homepage!");
- }else {
- next();
- }
- });
- app.use(function(request, response, next) {
- if(request.url == "/about") {
- response.send("Welcome to the about page!");
- }else {
- next();
- }
- });
- app.use(function(request, response) {
- response.send("404 error!");
- });
- app.listen(80);
上面代码通过request.url属性,判断请求的网址,从而返回不同的内容。
Express回调函数有两个参数,分别是request(简称req)和response(简称res),request代表客户端发来的HTTP请求,response代表发向客户端的HTTP回应,这两个参数都是对象。示例如下:
- function(req, res) {
- });
今天我们就先来学习如何使用req对象来处理客户端发来的HTTP请求。
req.host返回请求头里取的主机名(不包含端口号)。
req.path返回请求的URL的路径名。
如下示例:
- var express = require('express');
- var app = express();
- app.get("*", function(req, res) {
- console.log(req.path);
- res.send("req.host获取主机名,req.path获取请求路径名!");
- });
- app.listen(80);
query是一个可获取客户端get请求路径参数的对象属性,包含着被解析过的请求参数对象,默认为{}。
- var express = require('express');
- var app = express();
- app.get("*", function(req, res) {
- console.log(req.query.参数名);
- res.send("测试query属性!");
- });
- app.listen(80);
通过req.query获取get请求路径的对象参数值。
格式:req.query.参数名;请求路径如下示例:
例1: /search?n=Lenka
- req.query.n // "Lenka"
例2: /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
- req.query.order // "desc"
- req.query.shoe.color // "blue"
- req.query.shoe.type // "converse"
和属性query一样,通过req.param我们也可以获取被解析过的请求参数对象的值。
格式:req.param("参数名");请求路径如下示例:
例1: 获取请求根路径的参数值,如/?n=Lenka,方法如下:
- var express = require('express');
- var app = express();
- app.get("/", function(req, res) {
- console.log(req.param("n")); //Lenka
- res.send("使用req.param属性获取请求根路径的参数对象值!");
- });
- app.listen(80);
例2:我们也可以获取具有相应路由规则的请求对象,假设路由规则为 /user/:name/,请求路径/user/mike,如下:
- app.get("/user/:name/", function(req, res) {
- console.log(req.param("name")); //mike
- res.send("使用req.param属性获取具有路由规则的参数对象值!");
- });
PS:所谓“路由”,就是指为不同的访问路径,指定不同的处理方法。
和param相似,但params是一个可以解析包含着有复杂命名路由规则的请求对象的属性。
格式:req.params.参数名;
例1. 如上课时请求根路径的例子,我们就可以这样获取,如下:
- var express = require('express');
- var app = express();
- app.get("/user/:name/", function(req, res) {
- console.log(req.params.name); //mike
- res.send("使用req.params属性获取具有路由规则的参数对象值!");
- });
- app.listen(80);
查看运行结果,和param属性功能是一样的,同样获取name参数值。
例2:当然我们也可以请求复杂的路由规则,如/user/:name/:id,假设请求地址为:/user/mike/123,如下:
- app.get("/user/:name/:id", function(req, res) {
- console.log(req.params.id); //"123"
- res.send("使用req.params属性复杂路由规则的参数对象值!");
- });
send()方法向浏览器发送一个响应信息,并可以智能处理不同类型的数据。格式如下:
- res.send([body|status], [body]);
1.当参数为一个String时,Content-Type默认设置为"text/html"。
- res.send('Hello World'); //Hello World
2.当参数为Array或Object时,Express会返回一个JSON。
- res.send({ user: 'tobi' }); //{"user":"tobi"}
- res.send([1,2,3]); //[1,2,3]
3.当参数为一个Number时,并且没有上面提到的任何一条在响应体里,Express会帮你设置一个响应体,比如:200会返回字符"OK"。
- res.send(200); // OK
- res.send(404); // Not Found
- res.send(500); // Internal Server Error
send方法在输出响应时会自动进行一些设置,比如HEAD信息、HTTP缓存支持等等。
这些可以去汇智网去学习!
node.js(八) 有趣的东西才开始哦的更多相关文章
- Node.js服务端框架谁才是你的真爱
1. Express 背景: Express, 疯一般快速(而简洁)的服务端JavaScript Web开发框架,基于Node.js和V8 JavaScript引擎. Express 是一个基于 No ...
- 初学node.js有感一
Node.js感悟 一.前言 很久以前就对node.js十分的好奇和感兴趣,因为种种原因没能去深入的认识了解和学习掌握这门技术,最近正好要做一些项目,其中就用到了node.js中的一些东西,所以借着使 ...
- Node.js 教程 05 - EventEmitter(事件监听/发射器 )
目录: 前言 Node.js事件驱动介绍 Node.js事件 注册并发射自定义Node.js事件 EventEmitter介绍 EventEmitter常用的API error事件 继承EventEm ...
- NODE.JS之我见
NODE.JS之我见 先说说为什么有这篇文章,关注NODE.JS 也有一段时间了,不敢说大彻大悟,但是对于NODE.JS能干什么,还是有一定的了解,笔者多年以前就研究过JavaScript引擎V8,可 ...
- Node.js 在 PayPal实战
之前有过一个谈了很多关于PayPal移动到node.js的一个应用平台.作为设置我的免费用户界面的第1部分的延续,我很高兴地说,这些传言是真的,我们的Web应用程序正在从Java迁移到JavaScri ...
- Windows10安装node.js,vue.js以及创建第一个vue.js项目
[工具官网] Node.js : http://nodejs.cn/ 淘宝NPM: https://npm.taobao.org/ 一.安装环境 1.本机系统:Windows 10 Pro(64位)2 ...
- Node.js学习-1
关于node.js 首先,node.js不是一门语言,是一个平台.因为在以前,javascript主要是用于网页的交互,所以必须依附于浏览器存在,只有在浏览器上才能运行javascript. 后来ja ...
- Node.js 究竟是什么?
Node.js 究竟是什么? 一个 "编码就绪" 服务器 Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸 ...
- 高性能Web服务端 PHP vs Node.js vs Nginx-Lua 的对比分析
1. ngx_lua nodejs php 比较 我在研究一阵子ngx_lua之后发现lua语法和js真的很像,同时ngx_lua模型也是单线程的异步的事件驱动的,工作原理和nodejs相同,代码甚至 ...
随机推荐
- Easyui几种布局方式的使用
1.通过标记创建layout. 记得添加"easyui-layout"样式给div标记. <div id="cc" class="easyui ...
- ID3算法 决策树 C++实现
人工智能课的实验. 数据结构:多叉树 这个实验我写了好久,开始的时候从数据的读入和表示入手,写到递归建树的部分时遇到了瓶颈,更新样例集和属性集的办法过于繁琐: 于是参考网上的代码后重新写,建立决策树类 ...
- LDA 资料整理
LDA 中文名叫 隐含狄利克雷分布 有一个讲的数学八卦的pdf,如下: http://pan.baidu.com/s/1bnX6Pgb Latent Dirichlet Allocation(LDA) ...
- POJ 3368 RMQ-ST
一直感觉RMQ水,没自己写过,今天写了一道题,算是完全独立写的,这感觉好久没有了... 一直以来,都是为了亚洲赛学算法,出现了几个问题: 1.学的其实只是怎么用算法,对算法的正确性没有好好理解,或者说 ...
- Linux id 命令 - 显示用户id和组id信息
要登入一台计算机,我们需要一个用户名.用户名是一个可以被计算机识别的身份.基于此,计算机会对使用这个用户名的登陆的人应用一系列的规则.在Linux系统下,我们可以使用 id 命令. 什么是 id 命令 ...
- sqlplus中隐患组合键
在UNIX/Linux平台中的SQL*Plus命令行提示符下,如果误按了组合键:Ctrl+S,那么这个会话将被锁定,输入任何命令都没有显示出来的. 解锁组合键:Ctrl+Q 注意:在使用ctrl+s锁 ...
- JAVA程序猿面试题汇总
(此话题将不断更新,请留意) 第一,谈谈final, finally, finalize的差别. final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承.finally是异常 ...
- git创建分支
1.创建本地分支名称为dev的本地分支 git branch dev 2.将本地分支添加到远程分支 git push origin dev 3.查看创建的本地分支, 带有*符号的分支,代表当前所在分支 ...
- Android EditText小结
防止EditText获取焦点弹出输入法 android:focusable="true" android:focusableInTouchMode="true" ...
- mac 桌面美化
官网:Übersicht 先来大图: 当然,,,我自己的这个还不成型,去官网看看吧,有大神们做好的各种主题可选哦~ 像这样1: 这样2: 甚至这样3:(酷毙了有木有..) Downlo ...