Express框架
设置
即对环境设置的管理能力,例如在生产环境下讲express模板缓存起来,这样可以加快响应速度。
例如:
app.configure('production', function () {
app.enable('view cache');
});
express内置的一些实用设置(举例),即在app.set中定义:
-
严格路由
启用严格路由后,请求的路由最后的斜杆不会自动忽略,例如/test/route和/test/route/,在严格模式下只会匹配前者。 -
jsonp跨域支持
通过res.req()或res.jsonp()可以实现跨域JSON请求。Express会自动检查callback参数,并且通过设置app.enable(‘jsonp callback’)可以实现将jsonp请求的回调包裹在myCallback文本中的作用。
(jsonp的URL格式/test/route?callback=)
模板引擎
例如ejs模板(当然也可以使用其他引擎):
- 安装 cnpm install ejs@0.4.2
- 声明 view engine为ejs app.set(‘view engine’, ‘ejc’)
则Express就会根据配置的模板引擎调用require()
补充:还可以通过app.regitser(’.html’, require(模板名称))
错误处理
在Express中是将错误对象传递给next函数,默认情况下,Express会展示一个错误页面并发送500状态码。
例如:
app.error(function (err, req, res, next) {
if (err.message === '错误') {
res.render('错误');
} else {
next();
}
})
app.error(function (err, req, res) {
res.render('error', {status: 5000});
})
快捷方法
Express为Node中的Request和Response对象提供了一系列扩展来简化开发。
例如:
Request对象的扩展:
- header 获取头信息
req.header('host') //对大小写不敏感
- accepts 获取请求Accepts头信息
req.accepts('html')
req.accepts('text/html')
- is 检查Content-Type信息
req.is('json')
req.is('text/html')
Response对象的扩展:
- header 检查对应头信息是否已经在response上设置
res.header('content-type')
// 也可以用于设置头信息
res.header('content-type', 'application/json')
- render
res.render('template', function (err, html)) {}
- send 根据参数的类型执行响应的行为
Numebr:发送状态码
res.send(500);
String:发送HTML内容
res.send('<p>html</p>')
Object/Array:转化成JSON对象,并且设置相应的Content-Type头信息
res.send({hello: 'world'}); //json {"hello", "world"}
json:会将内容转化为JSON对象
res.send(5)
- redirect:相当于发送302(暂时移除)状态码和Location头信息
res.redirect('/newTarget')
//相当于
res.header('Location', '/newTarget');
res.send(302);
//也可以发送永久移除
res.redirect('/newTarget', 301);
- sendfile:类似于Connect的staitc中间件,但是它用于单个文件
res.sendfile('hh.jpg');
路由
在Express中定义路由时,可以使用自定义参数:
//这个name变量会注入到req.params对象上
app.get('/post/:name', function () {
})
在自定义变量后添加问号(表示该变量是可选的):
app.get('/post/:name?', function (req, res, next) {
})
在定义变量时,可以使用正则表达式(RegExp对象):
app.get(/^\/post\/([a-z\d\-1*])/, function (req, res, next) {
})
在路由处理程序中也可以使用next
app.get('/post/:name', function (req, res, next) {
if (req.params.name[0] === 'a') return next();
})
中间件
Express也具备中间件的特性,且Express是构建于Connect上的。即当创建Express服务器时,可以使用Connect兼容的中间件。
例如:
app.use(express.static(__dirname + '/images'));
或者,要想使用connect的session、cookie
app.use(express.session())
app.use(express.cookieParser())
Express中还可以指定特定匹配的路由中才使用中间件。
例如:
functionn secure (req, res, next) {
if (!req.session.logged_in) {
return res.send(403); //403 not authorized状态码
}
next();
}
简单的图片上传Demo
客户端(HTML)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<form action="http://localhost:8081/file_upload" method="post" enctype="multipart/form-data">
<input type="file" name="image" size="50" />
<br>
<input type="submit" value="上传文件">
</form>
</body>
</html>
服务端(JS)
let express = require('express'),
app = express(),
fs = require('fs');
let bodyParser = require('body-parser');
let multer = require('multer');
//中间件 路由定向
app.use('/public', express.static('public'));
//中间件 便于访问post参数
app.use(bodyParser.urlencoded({extended: false}));
//中间件
//dest 目的地 array是上传表单的input标签的name名称
//设置暂存文件地址
app.use(multer({dest: '/tmp/'}).array('image'));
app.get('/index.htm', (req, res) => {
res.sendFile(`${__dirname}/index.htm`);
});
app.post('/file_upload', (req, res) => {
//上传的文件信息
console.log(req.files[0]);
let des_file = `${__dirname}/${req.files[0].originalname}`;
fs.readFile(req.files[0].path, (err, data) => {
//保存的文件地址 要写入的文件
fs.writeFile(des_file, data, (err) => {
if (err) {
console.log(err);
} else {
response = {
message: 'File uploaded successfully',
filename: req.files[0].originalname
};
}
console.log(response);
res.end(JSON.stringify(response));
});
});
})
let server = app.listen(8081, () => {
let host = server.address().address,
port = server.address().port;
console.log(`应用实例,访问地址为${host}${port}`);
});
如果你和我同样是一个young coder!
欢迎关注本人公众号Code center——春繁秋实,年年常茂。
![](https://wjchumble.oss-cn-hangzhou.aliyuncs.com/codecenter.jpg)