zoukankan      html  css  js  c++  java
  • 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
    

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

  • 相关阅读:
    Ubuntu创建用户,给予sudo权限
    Walking Robot Simulation
    python remove与del 的区别
    ML Foundation
    python any()和all()
    python3无穷大,无穷小
    eclipse maven无法下载依赖时
    eclipse自动生成spring项目时各种报错最后处理方案
    Python+Selenium+Unittest实现PO模式web自动化框架(3)
    Python+Selenium+Unittest实现PO模式web自动化框架(2)
  • 原文地址:https://www.cnblogs.com/pangqianjin/p/14206771.html
Copyright © 2011-2022 走看看