express介绍
如有不详细或者不正确的地方多多指正。
我们可以拿js与jquery关系来类比一下:
jQuery是JS在浏览器环境下的封装库,把DOM操作,ajax等封装成了兼容性好,方便使用的方法
node是JS的一个非浏览器运行平台,里面提供API进行web服务器开发,封装了node关于web的一些API
两者有相同之处,express和jQuery都是对自己平台(node,DOM API)进行了封装
两者有不同之处,功能范畴完全不一样。express开发服务器,jquery做浏览器端操作。
express可以通过官方提供的命令行进行安装,官方目前默认的界面文件用jade格式,建议修改为pug格式的文件(jade版权问题) ,同时要在package.json中安装对应的npm包和app.js app.set('view engine', 'pug')
设置对应的界面引擎解释器。
路由
get请求
路由的使用首先要引入express的路由模块,express官网的一个简单的get请求路由示例
var express = require('express');
var app = express();
// respond with "hello world" when a GET request is made to the homepage
app.get('/', function(req, res) {
res.send('hello world');
});
post请求
post请求首先要引入bodyparse中间件,它用于解析客户端请求中的body中的内容,
使用express应用生成器生成一个网站,它默认已经使用了 bodyParser.json 与 bodyParser.urlencoded 的解析功能,除了这两个,bodyParser还支持对text、raw的解析。
app.use(bodyParser.json())
bodyParser.json是用来解析json数据格式的app.use(bodyParser.urlencoded({ extended: false }))
bodyParser.urlencoded则是用来解析我们通常的form表单提交的数据,也就是请求头中包含这样的信息: Content-Type: application/x-www-form-urlencoded;
extended:如果设置为false,那么对URL-encoded的数据的解析采用querystring库,如果设置为true那么采用qs库((querystring和qs的不同))
// home.pug
$.ajax({
url:userPath+"/userinfo-company",
data:{
module:'user',
userId:userId
},
type:"POST",
success:function(res){
alert(res);
},
error:function(error){
console.log(error);
}
});
// index.js
var bodyParser = require('body-parser'); // bodyparser中间件
<!--app.use(bodyParser.json());--> // bodyParser.json是用来解析json数据格式的
<!--app.use(bodyParser.urlencoded({ extended: false })); --> // bodyParser.urlencoded则是用来解析我们通常的form表单提交的数据,也就是请求头中包含这样的信息: Content-Type: application/x-www-form-urlencoded
router.post('/userinfo-company', function(req, res, next) {
var module = req.body.module;
var userid = req.body.userId;
request(
{
url: nodeApi + '/menu/getInfo',
method: 'POST',
form: {
module: module,
userId: userid
}
},
function(error,response,body) {
if( response.statusCode == 200 ) {
var tempArr = JSON.parse(body);
}
}
);
})
安全性问题后台无法读取到cookie,后面将请求菜单的方法放在了js中,然后在将菜单传到路由中,通过res.render进行动态渲染
router.post('/menu', function(req, res, next) {
menuArr = JSON.parse(req.body.menuArr);
res.send('OK');
});
后面发现可以传递cookie,但未在项目中使用
默认情况下,cookies是禁用的。在defaults或options将jar设为true,使后续的请求都使用cookie.
var request = request.defaults({jar: true})
request('http://www.google.com', function () {
request('http://images.google.com')
})
通过创建request.jar()的新实例,可以使用定制的cookie,而不是request全局的cookie jar。
var j = request.jar()
var request = request.defaults({jar:j})
request('http://www.google.com', function () {
request('http://images.google.com')
})
或者
var j = request.jar()
var cookie = request.cookie('your_cookie_here')
j.setCookie(cookie, uri, function (err, cookie){})
request({url: 'http://www.google.com', jar: j}, function () {
request('http://images.google.com')
})
注意,setCookie至少需要三个参数,最后一个是回调函数。
中间件
Express 是一个自身功能极简,完全是由路由和中间件构成一个的web开发框架:从本质上来说,一个 Express 应用就是在调用各种中间件。中间件(Middleware)是一个函数,如果当前中间件没有终结请求-响应循环,则必须调用next()方法将控制权交给下一个中间件,否则请求就会挂起。
中间件分为:应用级中间件,路由级中间件,错误处理中间件,内置中间件,第三方中间件。
上面用的bodyParser是应用级的中间件,router是路由级的中间件,有关中间件更详细的内容参见express官网(express中间件)
一些小的注意点
模板引擎前面的缩进要么是空格或者是tab,如果两者混用会报错。
express更改路由中的内容的时候必须要重启本地服务器。只需要全局安装supervisor,然后命令行supervisor app.js就可以自动重启。