一、入门Express框架实例
var express = require('express');
//引入express包,返回值是一个函数
var app = express();
//调用函数得到一个对象
app.get('/', function (req, res) {
res.send('Hello World');
})
//调用getAPI监听路由,这里监听根路径的,当有根路径请求时,返回Hello World。request 和 response 对象来处理请求和响应的数据。
var server = app.listen(8081, function () {
//监听的端口,服务启动后,触发回调函数,打印监听的IP和端口
var host = server.address().address
var port = server.address().port
console.log("应用实例,访问地址为 http://%s:%s", host, port)
})
结果是cmd里打印ip和端口,localhost的8081在浏览器打开有Hello World
也可以写作:
var app = require('express')();
app.get('/', (req, res)=> {
res.send('Hello World');
}).listen(8081,()=>{
console.log("running……")
})
二、托管静态文件(静态服务中间件)
什么是托管静态文件
html,js, css, image 都是存放在服务端的资源,当在浏览器中输入网址的后,我们就是向服务器请求这些资源,相对应的服务端就要有对应的路由来处理这些请求,否则就是404 not found 错误。
对于这些静态文件的路由处理,代码逻辑都是一致的,就是返回请求的文件。我们每写一个网站的服务端,都要处理这些静态文件的请求, 因为几乎所有的html文件是都包括js, css, image 文件。把这些一致的处理逻辑抽离出来,形成一个单独的组件,直接使用组件这就是express.static 中间件。
它处理js, css, image等静态文件的请求,它把我们对静态文件的路由处理封装起来。 它的参数是一个文件夹,就是当有请求过来的时候,直接到该文件来下寻找资源。我们直接把静态文件放到该文件夹,就不用写这些静态文件的路由了。(了解一下前端路由和后端路由)
这里还要注意一点,express.static 中间件的使用,要放到其它处理请求逻辑的前面, 因为页面在渲染的过程中首先请求的就是html, css, js 文件。
const express = require("express");
const app = express();
//实现静态资源服务,写入文件夹名,如public就可以访问其下的html,js, css, image等资源
let server = app.use(express.static("public"));
server.listen(3000,()=>{
console.log("running……");
})
let server = app.use('/abc',express.static("public"))
还可以加一个虚拟路径,就是不存在的,访问的时候就不是上图的localhost:3000/hello.html而是变成localhost:3000/abc/hello.html
三、路由
路由决定了由谁(指定脚本)去响应客户端请求。
//http常用请求方式
const express = require("express");
const app = express();
//查询
app.get('/', (req, res)=>{
res.send('get data');
});
//添加
app.post('/', (req, res)=>{
res.send('post data');
});
//更新
app.put('/', (req, res)=>{
res.send('put data');
});
//删除
app.delete('/', (req, res)=>{
res.send('delete data');
});
直接使用use分发可以处理所有路由请求
app.use('/', (req, res)=>{
res.send('okk');
});
四、中间件
先放个官方文档的中文链接,里面有案例,可以简单理解为处理过程中的一个环节。
1.应用层中间件
const express = require("express");
const app = express();
let total = 0;
app.use('/user',(req,res,next)=>{
//记录访问时间
console.log(Date.now());
// next方法的作用就是把请求传递到下一个中间件
next();
});
app. use('/user',(req, res , next)=>{
//记录访问日志
console.log('访问了/user');
next();
});
app.use('/user', (req,res)=>{
total++;
console.log(total);
res.send('result');
});
最后页面会显示result,每个函数都会被执行,因为next();这个属于应用级别的中间件。
2.路由中间件
如果不写next()会无法打印2,网页一直请求直到超时报错。
const express = require('express');
const app = express();
app.get('/abc',(req,res,next)=>{
console.log(1);
next();
}, (req,res)=>{
console.log(2);
res.send('abc');
});
app.listen(3000,()=>{
console.log('running...');
});
下面这种情况,网页有hello,会打印13,不会打印2。因为一个路由是指通过get、post、use等方法绑定的方法,1和2算作一个路由里的两个中间件。
const express = require(' express' );
const app = express();
app.get('/abc',(req,res,next)=>{
console.log(1);
//跳转到下一个路由
next('route');
},(req,res)=>{
console.log(2);
res.send('abc');
});
app.get(' /abc',(req,res)=>{
console.log(3);
res.send('hel1o');
});
app.listen(3000,()=>{
console.1og(' running...');
});
3.第三方中间件
详见这里,需要额外下载嚯。
用post去提交参数时:
const express = require('express');
const app = express();
const bodyParser = require('body-parser')
//挂载内置中间件
app.use(express . static('publid'));
//挂载参数处理中间件
app.use(bodyParser.urlencoded({ extended: false}));
app.post('/login',(req,res)=>{
let data = req.body;
if(data.username == 'admin' && data. password == '123' ){
res.send('success');
}else{
res.send('failure');
}
});
app.listen(3000,()=>{
console.log('running...');
});
<body>
<form action="http://localhost: 3000/login" method="post" >
用户名: <input type="text" name="username"><br>
密码: <input type="password" name=" password"><br>
<input type="submit" value=" 提交">
</form>
</body>
将form的method改为get,用get提交参数使用query对象
//处理get提交参数
app.get('/login' ,(req,res)=>{
let data = req.query;
console.log(data);
res.send('get data');
});