Node.js Express框架

Node.js Express框架

参考https://www.runoob.com/nodejs/nodejs-express-framework.html
Express核心特性

  • 可以设置中间件来响应HTTP请求
  • 定义了路由表用于执行不同的HTTP请求动作
  • 可以通过模板传递参数来动态渲染HTML页面

第一个Express框架实例

使用Express框架输出“Hello World”

var express = require('express')
var app = express();
    
    // GET请求
app.get('/', (req, res)=>{
	res.send('Hello World');
});

var server = app.listen(8081, ()=>{
	var host = server.address().address;
	var port = server.address().port;
	console.log(host);
	console.log("应用实例,访问地址为:http://%s:%s", host, port);
});

打开浏览器输入

  127.0.0.1:8081

结果:

请求和响应

Express应用使用回调函数的参数:requestresponse对象来处理请求和响应的数据。

  // GET请求
  app.get(routerpath, function(request, response){});

routerpath可以是字符串或正则表达式。

路由

路由决定了由谁(指定脚本)去响应客户端请求。
app.get(routerpath, function(request, response){});:GET请求的响应,routerpath可以是正则或字符串
app.post(routerpath, function(request, response){});:POST请求的响应,routerpath可以是正则或字符串。

var express = require('express')
var app = express();

// GET请求
app.get('/', (req, res)=>{
	console.log("主页GET请求");
	res.send('Hello GET');
});

// POST请求
app.post('/', (req, res)=>{
	console.log('主页POST请求');
	res.send('Hello POST');
});

// /list_user页面GET请求
app.get('/list_user', (req, res)=>{
	console.log("/list_user GET请求");
	res.send('用户列表界面');
});

// /del_user页面GET请求
app.get('/del_user', (req, res)=>{
	console.log("/del_user GET请求");
	res.send('删除页面');
});
// 对页面abcd,abxcd,ab123cd等GET请求
app.get('/ab*cd', (req, res)=>{
	console.log('/ab*cd GET请求');
	res.send("正则匹配");
});

var server = app.listen(8081, ()=>{
	var host = server.address().address;
	var port = server.address().port;
	console.log("应用实例,访问地址为:http://%s:%s", host, port);
});

在浏览器中输入:

  127.0.0.1:8081
  // 或者
  127.0.0.1:8081/list_user
  // 或者
  127.0.0.1:8081/del_user
  // 或者
  127.0.0.1:8081/ab任意字符cd

可以得到对象的页面响应。

静态文件

Express提供了内置的中间件express.static来设置静态资源(图片,CSS,JavaScript等)。
使用express.static中间件设置静态文件的路径:

  app.use('routerpath', express.static('path'));

routerpath是虚拟路径,path为真实路径,通过routerpath来访问path中的资源。

var express = require('express')
var app = express();

app.use('/resources', express.static('public'));
// GET请求
app.get('/', (req, res)=>{
	console.log("主页GET请求");
	res.send('Hello GET');
});

var server = app.listen(8081, ()=>{
	var host = server.address().address;
	var port = server.address().port;
	console.log("应用实例,访问地址为:http://%s:%s", host, port);
});

我的目录结构:

结果:

GET方法

通过GET方法提交两个参数,使用“/process_get”路由来处理输入:
index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<form action="http://127.0.0.1:8081/process_get" method="get">
			First Name:<input type="text" name="first_name" /><br />
			Last Name:<input type="text" name="last_name" /><br />
			<input type="submit" value="Submit"/>
		</form>
	</body>
</html>

main.js

var express = require('express')
var app = express();

app.use('/resources', express.static('public'));
// GET请求
app.get('/index.html', (req, res)=>{
	res.sendFile(__dirname+'/'+'index.html');
});

app.get('/process_get', (req, res)=>{
	// 输出为JSON格式
	var response = {
		"first_name":req.query.first_name,
		"last_name":req.query.last_name
	};
	console.log(response);
	res.end(JSON.stringify(response));
});

var server = app.listen(8081, ()=>{
	var host = server.address().address;
	var port = server.address().port;
	console.log("应用实例,访问地址为:http://%s:%s", host, port);
});

浏览器中访问

  127.0.0.1:8081/index.html

填写并提交表单后,会跳转到

  127.0.0.1:8081/process_get?firt_name=xxx&last_name=xxx

观察到

和控制台的输出

  { first_name: 'admin', last_name: '123456' }

POST方法

index.html: 和GET方法类似,改为

,其他不变;
main.js

var express = require('express')
var app = express();
var bodyParser = require('body-parser');

// 创建 application/x-www-form-urlencoded编码解析
var urlencodedParser = bodyParser.urlencoded({extended: false});

app.use('/resources', express.static('public'));
// GET请求
app.get('/index.html', (req, res)=>{
	res.sendFile(__dirname+'/'+'index.html');
});

app.post('/process_post', urlencodedParser, (req, res)=>{
	// 输出为JSON格式
	var response = {
		"first_name":req.body.first_name,
		"last_name":req.body.last_name
	};
	console.log(response);
	res.end(JSON.stringify(response));
});

var server = app.listen(8081, ()=>{
	var host = server.address().address;
	var port = server.address().port;
	console.log("应用实例,访问地址为:http://%s:%s", host, port);
});

结果:
浏览器端:

控制台:

  { first_name: 'admin', last_name: '123456' }

文件上传

使用POST方法和一个form表单,同时将表单的enctype属性设置为multipart/form-data。
index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h3>文件上传</h3>
		选择一个文件上传<br />
		<form action="/file_upload" method="post" enctype="multipart/form-data">
			<input type="file" name="image" size="50" /><br />
			<input type="submit" value="Submit"/>
		</form>
	</body>
</html>

main.js

var express = require('express');
var app = express();
var fs = require('fs');

var bodyParser = require('body-parser');
var multer = require('multer');

app.use('/public', express.static('public'));
app.use(bodyParser.urlencoded({extended: false}));
app.use(multer({dest: '/tmp/'}).array('image'));

app.get('/index.html', (req, res)=>{
	res.sendFile(__dirname+'/'+"index.html");
});

app.post('/file_upload', (req, res)=>{
	var file = req.files[0];//上传的第一个文件
	console.log(file);//上传的文件信息
	
	var des_file = __dirname+'/'+file.originalname;
	fs.readFile(file.path, (err, data)=>{
		fs.writeFile(des_file, data, (err)=>{
			var response = {message:'',filename:file.originalname};
			if(err){
				console.log(err);
				response.message = 'File upload failed';
			}
			else{
				response.message = 'File uploaded successfully';
			}
			console.log(response);
			res.end(JSON.stringify(response));
		});
	});
});

var server = app.listen(8081, ()=>{
	var host = server.address().address;
	var port = server.address().port;
	
	console.log("应用实例,访问地址:http://%s%s", host, port);
});

结果:

选择文件后:

点击上传后:

控制台输出:

  {
    fieldname: 'image',
    originalname: 'smile.jpg',
    encoding: '7bit',
    mimetype: 'image/jpeg',
    destination: '/tmp/',
    filename: 'aec0dc0dbfbdaedc56325e246a61cbe3',
    path: '\tmp\aec0dc0dbfbdaedc56325e246a61cbe3',
    size: 12281
  }
  { message: 'File uploaded successfully', filename: 'smile.jpg' }

并发现当前目录多了一个刚刚上传的文件-smile.jpg。

Cookie管理

使用中间件向Node.js服务器发送cookie信息:

var express = require('express');
var cookieParser = require('cookie-parser');
var util = require('util');

var app = express();
app.use(cookieParser());

app.get('/', (req, res)=>{
	console.log("Cookies: "+util.inspect(req.cookies));
	res.send("Cookies: "+util.inspect(req.cookies));
});

app.listen(8081);

结果:
浏览器输入

  127.0.0.1:8081

观察浏览器和控制台的输出。

原文地址:https://www.cnblogs.com/pangqianjin/p/14206771.html