express
基于NodeJS平台,快速、开放、极简的web开发框架
req:request请求对象
res:response响应对象
const express = require('express')
let app = express()
app.listen(3000,()=>{
console.log('Server is running')
})
//res 响应的对象
app.get('/login',function(req,res){
console.log(req)
res.send('<h2>这是登录的页面</h2>'); // 如果res.send(数字);则数字代表http响应状态码
});
app.get('/index',function(req,res){
res.sendFile(__dirname+'/index.html'); // res.sendFile(文件路径);
});
app.get('/baidu',function(req,res){
res.redirect('http://www.baidu.com');
});
app.get('/',function(req,res){
res.redirect('/index'); // res.redirect(重定向路径);
});
获取参数
const express = require('express');
let app = express();
app.listen(3000);
// url = http://localhost:3000/login?a=1&b=2
app.get('/login',function(req,res){
//req请求的对象
//console.log(req.method,req.url);
//获取查询字符串的数据并解析为对象
console.log(req.query); //{a:'1',b:'2'}
res.send('用户名:'+req.query.uname+'密码:'+req.query.upwd);
});
// url = http://localhost:3000/package/aa/2
app.get('/package/:pname/:pid',function(req,res){
//获取路由传参的数据
console.log(req.params);//对象 {pname:'aa',pid:'2'}
res.send('包名称:'+req.params.pname+'版本号:'+req.params.pid);
});
获取post请求数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>登录页面</h2>
<form action="/login" method="post">
帐号: <input type="text" name="uname"><br>
密码: <input type="password" name="upwd"><br>
<input type="submit">
</form>
</body>
</html>
const express=require('express');
//引入查询字符串模块
const querystring=require('querystring');
let app=express();
app.listen(8088);
//获取登录网页路由: get /login
app.get('/login',function(req,res){
//响应文件
res.sendFile(__dirname+'/login.html');
});
//根据表单的请求,来创建对应的路由
//创建路由,post /mylogin,响应'登录成功'
app.post('/login',function(req,res){
//获取数据,监听是否有数据传递,通过回调函数获取,此回调函数是异步!
req.on('data',function(chunk){
//chunk 就是分段传递的数据 , 格式为buffer , 转为字符串后为查询字符串
console.log(chunk.toString());
//查询字符串解析为对象
let obj=querystring.parse(chunk.toString());
console.log(obj);
});
res.send('欢迎登陆');
console.log('send');
});
中间件
分为应用级中间件、路由级中间件、内置中间件、第三方中间件、错误处理中间件
应用级中间件
也称为自定义中间件
const express = require('express');
let router = express.Router();
//中间件:拦截对URL为/admin的请求
router.use('/index',function(req,res,next){
//获取查询字符串传递的数据
console.log(req.query);
//如果用户名不是root,
if(req.query.uname!=='root'){
res.send('请使用管理员登录');
}else{
//执行下一步,可能是下一个中间件,也可能是路由
next();
}
});
router.get('/index',function(req,res){
res.send('ok');
});
module.exports=router;
内置中间件
托管静态资源:把所有的静态资源托管到指定的目录,如果浏览器请求文件,自动到该目录下查找,不需要创建路由响应文件
const express=require('express');
let app=express();
app.listen(8080);
//托管静态资源(html,css,js,img...):一旦浏览器请求文件,自动到public目录下寻找;不需要创建路由
app.use( express.static('public') );
app.use( express.static('files') );
路由器
路由级中间件
创建路由器
//index.js
const express = require('express');
let router = express.Router();
router.get('/index',function(req,res){
res.send('ok');
});
module.exports=router;
//user.js
//引入express
const express=require('express');
//创建路由器对象
let router=express.Router();
//往路由器中添加路由
//get 127.0.0.1:8080/user/reg
router.get('/reg',function(req,res){
res.send('这是注册');
});
//get 127.0.0.1:8080/user/list
router.get('/list',function(req,res){
res.send('这是用户列表');
});
//导出路由器对象
//exports/module.exports
module.exports=router;
在服务器下引入并使用路由器
//app.js
const express=require('express');
//引入用户路由器自定义模块
const indexRouter=require('./index.js');
const userRouter=require('./user.js');
let app=express();
app.listen(8080);
//服务器使用路由器
app.use('/',indexRouter);
//给路由中的URL添加前缀 /user/reg
app.use('/user',userRouter);
访问形式
http://127.0.0.1:8080/路由器访问名/请求名
解析post参数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h2>登录页面</h2>
<form action="/mylogin" method="post">
帐号: <input type="text" name="uname"><br>
密码: <input type="password" name="upwd"><br>
<input type="submit">
</form>
</body>
</html>
const express=require('express');
let app=express();
app.listen(8088);
//获取登录网页路由: get /login
app.get('/login',function(req,res){
//响应文件
res.sendFile(__dirname+'/login.html');
});
//解析post请求参数
app.use(express.urlencoded({
extended:false //不使用qs模块
}));
app.use(express.json())
//根据表单的请求创建对应路由
//post /mylogin
app.post('/mylogin',function(req,res){
console.log(req.body);
res.send('登录成功');
});
cors跨域
处理跨域
安装
npm install cors
var express = require('express');
const cors = require("cors");
var app = express();
app.use(cors({
//[允许跨域访问服务器地址,多个地址用逗号隔开]
origin: ['http://localhost:8081', 'http://127.0.0.1:8081', 'http://127.0.0.1:5500'],
credentials: true
}))
var app = express();
// 所有服务器都可以跨域访问,方便调试
// app.use(cors());
express脚手架
安装
npm install -g express-generator
创建项目
express -e 项目名
安装所有依赖包
cd 项目名
npm install
启动项目
npm
第三方模块
mysql模块
基于NodeJS平台,快速、开放、极简的操作mysql数据库的模块
安装
npm install mysql
引入
const mysql=require('mysql');
操作
// mysql.createConnection() 创建普通连接对象
var connection=mysql.createConnection({
host:'127.0.0.1', //数据地址
port:'3306', //数据库端口
user:'root', //用户名
password:'', //密码
database:'DBNAME' //进入的数据库
});
connection.connect(); // 执行连接
// connection.query() 执行SQL命令,会建立连接
var sqlstr = 要执行的sql语句
connection.query( sqlstr ,function( err,result ){
if(err) throw err; //err 报错
console.log(result); //result 返回值
});
?占位符
在sql语句中数据部分通过?代替,在执行时以参数的形式传入,可以防止sql注入
connection.query( ' ...?,?,? ' , [ 1,2,3 ] , function( err,result ){
if(err) throw err; //err 报错
console.log(result); //result 返回值
});
set
var emp = { ename : 'tom', sex : 1, salary : 1000 }
// ? 传入对象会被解析成 属性名=属性值,
// insert into emp set ename = 'tom', sex = 1, salary = 1000
connection.query('insert into emp set ?',[emp],(err,result)=>{
if(err) throw err;
console.log(result);
});
连接池
// mysql.createPool() 创建连接池对象
var pool=mysql.createPool({
host:'127.0.0.1',
port:'3306',
user:'root',
password:'' ,
database:'DBNAME',
connectionLimit:20 //设置连接池大小,默认15
});
pool.query(); // 执行SQL命令,会建立连接