Express整合 multer使用 consolidate和route

34 0

安装

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);
0
  • 本文分类:Node
  • 本文标签:暂无标签
  • 流行热度:已超过 34 人围观了本文
  • 发布日期:2020年07月28日 - 18时44分00秒
  • 版权申明:本文系作者@木灵鱼儿原创发布在木灵鱼儿站点。未经许可,禁止转载。

评论(0)

微信收款码
微信收款码