创建application
要首先安装express cnpm install express
let express = require('express');
let app = express();
解析请求体
app.use() 用来在 express 中 添加中间件
app.use('/', function(req, res, next){ // 第一个参数 路径 可以不传 默认 / 第二个是中间件回调 所有包含/的请求都会进入到这个函数/admin /app
// req 是express 内部的封装的请求对象
// res 是 express 内部封装的相应对象
// next 是否调用next 决定是不是能继续调用后面的 接口或中间件
})
app.use(function(err, req, res, next){ // 第一个参数 路径 可以不传 默认 / 第二个是中间件回调
// 当只传入回调 并且有4个参数的时候 为错误处理中间件
// req 是express 内部的封装的请求对象
// res 是 express 内部封装的相应对象
// next 是否调用next 决定是不是能继续调用后面的 接口或中间件
})
使用中间件 body-parser 来解析请求体,安装 cnpm i body-parser。
app.use(bodyParser.json()); // application/json
app.use(bodyParser.urlencoded({ extended: true })); // 解析 application/x-www-form-urlencoded extended true 使用querystring false 使用 qs
app.use(bodyParser.raw()) // 用于解析二进制数据
app.use(bodyParser.text()) // 用于解析html/text
// 特殊用法 把text/html 用 json 来解析
app.use(bodyParser.text({ type: 'text/html' }))
权限校验
为什么会有cookie 和 session 出现 为了解决http 无状态问题 即不知道请求的时候是不是还有权限访问当前服务 cookie 和 session 用于记录状态 cookie 和 session的区别就是 前者存储在前端 后者 存储在后端
- 使用cookie-parser
cnpm i cookie-parser来解析cookie
let cookieParser = require('cookie-parser');
app.use(cookieParser('key')); // 如果需要签名 则需要配置密钥
使用 express-session 来管理session。cnpm i express-session session 可以使用cookie 发送到前端 一般这时的cookie 的有效期设置为0; 即回话期间有效。 也可以重写url。
let session = require('express-session');
app.use(session({
secret: '12345', // 加密的密钥 1.5.0后不依赖cookie-parser
name: 'testapp', //这里的name值得是cookie的name,默认cookie的name是:connect.sid
cookie: {maxAge: 0}, //设置
resave: false, // 是否重新生成 session 一般不要
saveUninitialized: true, // 是否报错未初始化的session 如果为false 则rolling true 不会刷新为初始化的session 设置为true 可以设置验证码登陆
rolling: true, // 每次发送来新的请求则刷新失效时间
// 可以存到数据库
// store: new MongoStore({ //创建新的mongodb数据库
// host: 'localhost', //数据库的地址,本机的话就是127.0.0.1,也可以是网络主机
// port: 27017, //数据库的端口号
// db: 'test-app' //数据库的名称。
// })
}));
// 通过req.session 来获取session 如果存在了session 则可以获取到
app.get('/', function(req, res, next) {
if (req.session.views) {
req.session.views++
res.setHeader('Content-Type', 'text/html')
res.write('<p>views: ' + req.session.views + '</p>')
res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>')
res.end()
} else {
req.session.views = 1
res.end('welcome to the session demo. refresh!')
}
})
- 除了使用session 还可以使用 jwt 类进行身份验证
cnpm i jsonwebtoken
let jwt = require('jsonwebtoken');
// 生成token
let token = jwt.sign({exp: Math.floor(Date.now() / 1000) + 30,
data: {username, password}}, SECRET)
res.end({token});
// token 校验
jwt.verify(req.query.tokenm, SECRET, (err, decode) => {
res.json({token: decode})
})
请求处理
- 使用app
app.all('/user', function (req, res, next) { // 不管何种请求方式 /user 路径的请求都进入和use 的区别 就是 路径必须全等
// req 封装的请求对象
// res 相应对象
console.log('although this matches');
next();
});
app.get('/user/:id', function (req, res, next) {
// req 封装的请求对象
// res 相应对象
console.log('although this matches');
next();
});
app.get('/user/:id', function (req, res) {
console.log('and this matches too');
res.end();
});
// 当使用了body-parser 来解析 form表单数据 则会把参数放到 req.body
app.post('/api/:id', (req, res, next) => {
res.cookie('my-cookie', 'value123', { signed: true });
let {headers, body, params, cookies, ip, signedCookies} = req;
// res.download(path.resolve(__dirname, './html/1.txt'), '1.txt', function(err) {
// if (err) console.log('err', chalk.red(err));
// });
res.end(JSON.stringify({path: req.path, headers, body, cookies, params, ip, signedCookies}));
});
- 解析form-data 使用 multer
cnpm i multer
const multer = require('multer');
// dest 存放文件的目录 limits 限制上传文件的大小
const upload = multer({ dest: 'files/', limits: 100000000000 });
router.post('/upload', upload.single('file'), function(req, res) {
let oldPath = path.resolve(req.file.path);
let newPath = path.resolve(req.file.destination, req.file.originalname);
fs.rename(oldPath, newPath, (err) => { // 修改文件名称
console.log('err', err)
})
res.json({status: '00011'})
})
关于 res
// res.json({a: 1}); // 会设置json 请求头 并发送数据
// res.jsonp({a: 1}); // 会把参数给jsonp 的回调
// res.send(); // 可以写入任意内容 buffer json string 并且根据内容类型设置 请求头
// res.header("Content-Type", "application/json;charset=utf-8"); // 设置请求头
关于相应头的content-type 可以使用 mime 类解析文件的类型 cnpm i mime
let mine = require('mime');
mime.getType('js') // 'application/javascript'
监听端口
app.listen(5002, () => {})