Node.js——Express框架知识(简单概要)

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中的RequestResponse对象提供了一系列扩展来简化开发
例如:

Request对象的扩展:

  1. header 获取头信息
	req.header('host')  //对大小写不敏感
  1. accepts 获取请求Accepts头信息
	 req.accepts('html')
	 req.accepts('text/html')
  1. is 检查Content-Type信息
	 req.is('json')
	 req.is('text/html')

Response对象的扩展:

  1. header 检查对应头信息是否已经在response上设置
	res.header('content-type')
	// 也可以用于设置头信息
	res.header('content-type', 'application/json')
  1. render
	 res.render('template', function (err, html)) {}
  1. 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)
  1. redirect:相当于发送302(暂时移除)状态码Location头信息
	res.redirect('/newTarget')
	//相当于
	res.header('Location', '/newTarget');
	res.send(302);

	//也可以发送永久移除
	res.redirect('/newTarget', 301);
  1. 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——春繁秋实,年年常茂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值