nodejs中express入门和基础知识点学习
初始化
新建一个目录myapp,项目初始化
$npminit
安装express
$npminstallexpress--save
创建一个helloworld实例
进入myapp目录,创建一个名为app.js
varexpress=require('express');
varapp=express();
app.get('/',function(req,res){
res.send('HelloWorld!');
});
varserver=app.listen(3000,function(){
varhost=server.address().address;
varport=server.address().port;
console.log('Exampleapplisteningathttp://%s:%s',host,port);
});
上面的代码启动一个服务并监听从3000端口进入的所有连接请求。他将对所有(/)URL或路由返回“HelloWorld!”字符串。对于其他所有路径全部返回404NotFound。
通过以下命令行启动
$nodeapp.js
express生成器
通过应用生成器工具express可以快速创建一个应用的骨架。
1.安装以下命令
$npminstallexpress-generator-g
2.在当前目录创建myapp的应用,运行以下命令
$expressmyapp $cdmyapp $npminstall>setDEBUG=myapp&npmstart
通过Express应用生成器创建的应用一般都有如下目录结构:
├──app.js ├──bin │└──www ├──package.json ├──public │├──images │├──javascripts │└──stylesheets │└──style.css ├──routes │├──index.js │└──users.js └──views ├──error.jade ├──index.jade └──layout.jade 7directories,9files
express路由
路由(Routing)是由一个URI(或者叫路径)和一个特定的HTTP方法(GET、POST等)组成的,涉及到应用如何响应客户端对某个网站节点的访问。每一个路由都可以有一个或者多个处理器函数,当匹配到路由时,这个/些函数将被执行。
路由的定义由如下结构组成:app.METHOD(PATH,HANDLER)。其中,app是一个express实例;METHOD是某个HTTP请求方式中的一个;PATH是服务器端的路径;HANDLER是当路由匹配到时需要执行的函数。
以下是一些常见的路由代码:
varexpress=require('express');
varapp=express();
//respondwith"helloworld"whenaGETrequestismadetothehomepage
app.get('/',function(req,res){
res.send('helloworld');
});
//POSTmethodroute
app.post('/',function(req,res){
res.send('POSTrequesttothehomepage');
});
//app.all()是一个特殊的路由方法,没有任何HTTP方法与其对应,它的作用是对于一个路径上的所有请求加载中间件。
app.all('/secret',function(req,res,next){
console.log('Accessingthesecretsection...');
next();//passcontroltothenexthandler
});
使用字符串模式的路由路径示例:字符?、+、*和()是正则表达式的子集,-和.在基于字符串的路径中按照字面值解释。
//匹配acd和abcd
app.get('/ab?cd',function(req,res){
res.send('ab?cd');
});
//匹配abcd、abbcd、abbbcd等
app.get('/ab+cd',function(req,res){
res.send('ab+cd');
});
//匹配abcd、abxcd、abRABDOMcd、ab123cd等
app.get('/ab*cd',function(req,res){
res.send('ab*cd');
});
//匹配/abe和/abcde
app.get('/ab(cd)?e',function(req,res){
res.send('ab(cd)?e');
});
//使用正则表达式的路由路径示例:
//匹配任何路径中含有a的路径:
app.get(/a/,function(req,res){
res.send('/a/');
});
//匹配butterfly、dragonfly,不匹配butterflyman、dragonflyman等
app.get(/.*fly$/,function(req,res){
res.send('/.*fly$/');
});
路由句柄
可以为请求处理提供多个回调函数,其行为类似中间件。唯一的区别是这些回调函数有可能调用next('route')方法而略过其他路由回调函数。
路由句柄有多种形式,可以是一个函数、一个函数数组,或者是两者混合,如下所示:
//使用多个回调函数处理路由(记得指定next对象):
app.get('/example/b',function(req,res,next){
console.log('responsewillbesentbythenextfunction...');
next();
},function(req,res){
res.send('HellofromB!');
});
//使用回调函数数组处理路由:
varcb0=function(req,res,next){
console.log('CB0');
next();
}
varcb1=function(req,res,next){
console.log('CB1');
next();
}
varcb2=function(req,res){
res.send('HellofromC!');
}
app.get('/example/c',[cb0,cb1,cb2]);
响应方法
下表中响应对象(res)的方法向客户端返回响应,终结请求响应的循环。如果在路由句柄中一个方法也不调用,来自客户端的请求会一直挂起。
方法描述:
- res.download()提示下载文件。
- res.end()终结响应处理流程。
- res.JSON()发送一个JSON格式的响应。
- res.jsonp()发送一个支持JSONP的JSON格式的响应。
- res.redirect()重定向请求。
- res.render()渲染视图模板。
- res.send()发送各种类型的响应。
- res.sendFile以八位字节流的形式发送文件。
- res.sendStatus()设置响应状态代码,并将其以字符串形式作为响应体的一部分发送。
app.route()
可使用app.route()创建路由路径的链式路由句柄。由于路径在一个地方指定,这样做有助于创建模块化的路由,而且减少了代码冗余和拼写错误。
app.route('/book')
.get(function(req,res){res.send('Getarandombook');
})
.post(function(req,res){res.send('Addabook');
})
.put(function(req,res){res.send('Updatethebook');
});
express.Router
可使用express.Router类创建模块化、可挂载的路由句柄。Router实例是一个完整的中间件和路由系统,因此常称其为一个“mini-app”。
在app目录下创建名为birds.js的文件,内容如下:
varexpress=require('express');
varrouter=express.Router();
//该路由使用的中间件
router.use(
functiontimeLog(req,res,next){
console.log('Time:',Date.now());
next();
});
//定义网站主页的路由
router.get('/',function(req,res){
res.send('Birdshomepage');
});
//定义about页面的路由
router.get('/about',function(req,res){
res.send('Aboutbirds');
});
module.exports=router;
然后在应用中加载路由模块:
varbirds=require('./birds');
...
app.use('/birds',birds);
应用即可处理发自/birds和/birds/about的请求,并且调用为该路由指定的timeLog中间件。
利用Express托管静态文件
通过Express内置的express.static可以方便地托管静态文件,例如图片、CSS、JavaScript文件等。
将静态资源文件所在的目录作为参数传递给express.static中间件就可以提供静态资源文件的访问了。例如,假设在public目录放置了图片、CSS和JavaScript文件,你就可以:
app.use(express.static('public'));
现在,public目录下面的文件就可以访问了。
http://localhost:3000/images/kitten.jpg http://localhost:3000/css/style.css http://localhost:3000/js/app.js http://localhost:3000/images/bg.png http://localhost:3000/hello.html
如果你的静态资源存放在多个目录下面,你可以多次调用express.static中间件:
app.use(express.static('public'));
app.use(express.static('files'));
如果你希望所有通过express.static访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现,如下所示:
app.use('/static',express.static('public'));
现在,你就爱可以通过带有“/static”前缀的地址来访问public目录下面的文件了。
http://localhost:3000/static/images/kitten.jpg http://localhost:3000/static/css/style.css http://localhost:3000/static/js/app.js http://localhost:3000/static/images/bg.png http://localhost:3000/static/hello.html
常见问题
如何处理404?
在Express中,404并不是一个错误(error)。因此,错误处理器中间件并不捕获404。这是因为404只是意味着某些功能没有实现。也就是说,Express执行了所有中间件、路由之后还是没有获取到任何输出。你所需要做的就是在其所有他中间件的后面添加一个处理404的中间件。如下:
app.use(function(req,res,next){
res.status(404).send('Sorrycantfindthat!');
});
Express支持哪些模板引擎?
Express支持任何符合(path,locals,callback)接口规范的模板引擎。
如何渲染纯HTML文件?
不需要!无需通过res.render()渲染HTML。你可以通过res.sendFile()直接对外输出HTML文件。如果你需要对外提供的资源文件很多,可以使用express.static()中间件。