node express 快速入门
基本的概念和使用
express 是目前基于node.js开发的比较流行的web开发框架,可以帮助用户快速搭建一个功能完善的网站。
express的核心也是基于node.js的http模块进行封装,提供出来比较方便的使用框架,下面看一个简单的例子使用express框架搭建一个简单的web服务器
var express = reqiure('express');
var app = express();
app.get('/',function(req,res){
res.send('Hello Express.');
});
app.listen(9090);
上面的代码就构建了一个简单的服务器,基于Express开发提供api的后台的话,大部分工作都是在编写路由层和数据库操作(搭配mongoose使用很便捷,也可采用其他数据库及数据库中间件)。
所谓“路由”,就是指为不同的访问路径,指定不同的处理方法。
中间件(middleware)就是处理HTTP请求的函数。它最大的特点就是,一个中间件处理完,再传递给下一个中间件。App实例在运行过程中,会调用一系列的中间件。
在Express中每个中间件都可以从App实例中得到3个参数对象,依次分别为Request(Http请求对象),Response(Http响应对象),Next回调函数(表示下一个中间件),每一个中间件都可以处理request请求,并做处理,并决定是否传给下一个中间件
一个不进行任何操作、只传递request对象的中间件,就是下面这样。
function uselessMiddleware(req, res, next) {
next();
}
上面代码的next就是下一个中间件。如果它带有参数,则代表抛出一个错误,参数为错误文本。
function uselessMiddleware(req, res, next) {
next('出错了!');
}
注意 : 抛出错误以后,后面的中间件将不再执行,直到发现一个错误处理函数为止
在Express 注册中间件的方法:use
use是express注册中间件的方法,它返回一个函数。下面是一个连续调用两个中间件的例子。
var express = reqiure('express');
var app = express();
//使用中间件
app.use(function(req,res,next){
console.log('The First Middleware');
//调用next
next();
});
app.use(function(req,res){
console.log('The Last Middleware.');
res.writeHead(200, { "Content-Type": "text/plain" });
res.end('Hello ');
});
app.listen(9090);
解释下调用逻辑:
在改实例中,app注册了两个中间件,第一个含有参数next,第二个不含有next参数,收到Http请求后,先调用第一个中间件,然后打印一行信息,在第一个中间件中打印完毕信息紧接着调用了next(),又将请求传递到了下一个中间件,在第二个中间件中并没有next,所以该请求到此结束,中间件的调用流程是顺序执行的,原则就是:先注册先调用。
再来看下路由
在上面的简单的例子中也可以实现简单的路由(主要根据request请求的url来做判断)
var express = require('express');
var app = express();
//开始编写简单的路由
app.use(function(req,res,next){
if(req.url === '/'){
res.writeHead(200, { "Content-Type": "text/plain");
res.end('Home');
}else{
next();
}
});
app.use(function(req,res,next){
if(req.url == '/about'){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('About');
}else{
next();
}
});
//处理找不到的情况
app.use(function(req,res){
res.writeHead(404, { "Content-Type": "text/plain" });
res.end('Not Found');
});
app.listen(9090);
上面的方式看着可用,但是不够优雅,不够简洁,use提供另一种方式使用:除了在回调函数内部判断请求的网址,use方法也允许将请求网址写在第一个参数。这代表,只有请求路径匹配这个参数,后面的中间件才会生效。无疑,这样写更加清晰和方便。
上面的代码就可以改写为
app.use('/home',function(req,res,next){
res.writeHead(200,{'Content-Type':'text/plain'});
res.end('Home');
});
//下面的就不再一一列举了
app.use(....);
....
关于express的方法说明
除了提供use之外,还提供了一些方便处理请求的方式,get、post、put、delete方法,即HTTP动词都是Express的方法。还有一个all方法即所有的请求都会调用改中间件
举例说明:
app.all("*", function(request, response, next) {
response.writeHead(200, { "Content-Type": "text/plain" });
next();
});
app.get("/", function(request, response) {
response.end("Welcome to the homepage!");
});
app.get("/about", function(request, response) {
response.end("Welcome to the about page!");
});
app.get("*", function(request, response) {
response.end("404!");
});
到此为止,你应该对这些有了个基础的概念,下面说下路由层的分离,一般会在项目中的专门文件夹routes下
举个简单的例子
1、编写路由层route_test.js
module.exports = function(app){
app.get('/',function(req,res){
.....
});
app.get('/about',function(req,res){
.....
});
app.post('/create',function(req,res){
.....
});
.....
}
使用
var express = require('express')
var app = express();
//导入路由层
var route = reqiure('./route_test');
route(app);
app.listen(9090);
希望能帮助入门的用户,详细的可参照阮一峰老师的 Express框架