Express整合 multer使用 consolidate和route
安装
npm i jade ejs express express-static body-parser cookie-parser cookie-session
基本
const express = require("express");
const expressStatic = require("express-static");
const cookieParser = require("cookie-parser")
const cookieSession = require("cookie-session");
const bodyParser = require("body-parser");
const multer = require("multer");
const pathLib = require("path");
const fs = require("fs");
const ejs = require("ejs");
const jade = require("jade");
var server = express();
server.listen(8080);
//解析cookie,签名
server.use(cookieParser("asdhijashdjkashjkdasjkgfjaskjdgajhsgdhjka"));
//使用session
let arrKeys = [];
for (let i = 0; i < 100000; i++) {
arrKeys.push('keys_' + Math.random());
}
server.use(cookieSession({
name: "node_se",
keys: arrKeys,
maxAge: 20 * 60 * 60 * 1000
}));
//post
//文本解析
server.use(bodyParser.urlencoded({ extended: false }));
//文件解析 dest为上传路径,减少使用内存缓存文件
server.use(multer({ dest: './www/upload' }).any());
//用户请求
server.post('/upload', (req, res, next) => {
const reqFile = req.files[0];
const ext = pathLib.parse(reqFile.originalname).ext;
const newName = reqFile.path + ext;
// 修改后缀名,默认上传后缀名没有的,fs修改文件名需要完整路径+文件名
fs.rename(reqFile.path, newName, err => {
if (err) {
res.send("上传失败");
} else {
res.send("上传成功");
}
});
});
//static文件读取
server.use(expressStatic("./www"));
需要注意一点事,html的表单上传,默认是application/x-www-form-urlencoded
,如果要上传文件,需要将enctype
属性改为multipart/form-data
例子
<form action="/upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<button type="submit">提交</button>
</form>
multer
由于body-parser
中间件只能处理文本,而上传的文件无法读取,所以需要使用multer
来对文件进行读取
multer的使用,引入改中间件后,需要multer()
先运行一次创建multer对象,然后使用对象里的方法,其中any()
表示任何文件,还有一些其他方法,如:single('xxx')
表示上传的文件名必须为指定的名字。
multer默认将上传的文件保存在缓存里面,如果上传的内容很大,或者量大,很明显会对服务器性能产生影响,所以一般推荐直接存到本地,我们在创建multer对象时进行配置,传入一个文件保存的路径,这样上传的文件会直接保存在磁盘,从而减少内存的使用。
除了路径还有很对其他配置,具体可以看看介绍:multer
文件名
multer上传后的文件名会随机命名,并且文件的后缀类型是没有的,所以需要我们在上传后手动进行修改。
使用multer中间件后,我们通过request对象的files属性可以获取到上传的文件数组,通过数组下标我们可以获取到如下的文件信息:
{
fieldname: 'file',
originalname: 'Discuz_X3.4_SC_UTF8【20191201】.zip',
encoding: '7bit',
mimetype: 'application/x-zip-compressed',
destination: './www/upload',
filename: '9c6c91c640a4bf6ad0148cad80692f62',
path: 'www\\upload\\9c6c91c640a4bf6ad0148cad80692f62',
size: 11800498
}
其中path为上传后的文件路径+文件名,originalname为原始的文件信息。
我们要修改文件名的话需要使用fs模块,fs中有rename方法,三个参数,第一个为原始名,也就是path,第二个为新文件名:path+文件后缀,第三个为回调函数。
现在我们只需要搞定新文件名即可,如何获取后缀呢?
使用path中间件,将originalname传入,会自动分解成一个对象,对象里面有对应的信息。
pathLib.parse(reqFile.originalname).ext
其中pathLib.parse(reqFile.originalname)
可以获取到如下信息:
{
root: '',
dir: '',
base: 'Discuz_X3.4_SC_UTF8【20191201】.zip',
ext: '.zip',
name: 'Discuz_X3.4_SC_UTF8【20191201】'
}
其中ext为后缀名。
这样就可以得到新文件名了,然后就是回调了,只要err不存在,就是成功。
consolidate
模板引擎整合,用于不同的模块之间的切换,支持很多引擎
安装
npm install consolidate
配置
consolidate的使用需要先配置三个设置:
const express = require("express");
const consolidate = require("consolidate");
var server = express();
server.listen(8080);
//输出什么东西
server.set("view engine","html");
//模板文件的路径
server.set("views","./views");
//使用什么引擎
server.engine("html",consolidate.ejs);
server.get('/',(req,res)=>{
res.render("1.ejs",{name:"zhangsan"});
});
server.set("view engine","html");
表示输出html,参数固定的
server.set("views","./views");
表示模板的路径,第一个参数必须为views,第二个为模板的路径地址
server.engine("html",consolidate.ejs);
表示渲染成html文件时用的模板为ejs。
配置设置好后,直接在get,use,post的请求里面,通过res对象的render方法给浏览器返回渲染的html。
render有两个参数,第一个为模板文件名,由于配置的路径,所以views下的根文件直接给文件名即可,第二个参数为模板里面用到的变量。
当我们需要修改模板的时候,只需要修改server.engine("html",consolidate.ejs);
里对应的模板,和调用时使用的模板文件即可。
router 路由
express自带router,和vue的路由差不多,只是用法有点区别,路由也支持嵌套,一般用于区分不同的网页。
基本
//创建一个路由
let router = express.Router();
//指定路由要管理的地址段
server.use('/user',router);
//根据需求配置路由页
router.get('/a.html',(req,res)=>{
});
router.get('/b.html',(req,res)=>{
});
//第二个路由
let router2 = express.Router();
server.use('/avitvr',router2);
router2.get('/a.html',(req,res)=>{
});
router2.get('/b.html',(req,res)=>{
});
这两个路由分别管理user/x.html和active/x.html
嵌套路由
let router = express.Router();
let routers = express.Router();
server.use('/user',router);
router.use('/login',routers);
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据