learn express

Author Avatar
Feax 12月 20, 2017
  • 在其它设备中阅读本文章

深入了解express

构建一个 express 实例

cnpm i express-generator -g

目录结构

.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.jade
    ├── index.jade
    └── layout.jade

7 directories, 9 files

中间件

应用级中间件

<!-- 没有挂载路径 -->
app.use(function (req, res, next) {
    ...

    next()
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
})
<!-- 挂载路径的中间件 -->
app.use('/user/', function(req, res, next){
    ...

    next()
})
路由和句柄函数,处理get(post)请求
app.get('/', function() {
    res.send('USER')
})

路由级中间件

var app = express()
var router = express.Router()

和上面类似,只是写法不同
router.use('/', function(req, res, next) {
    ...

    next()
})

<!-- 此处理是在同一个文件夹下 -->
app.use('/', router)

错误处理中间件

app.use(function (err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

内置中间件

唯一内置中间件:express.static()

  • dotfiles

是否对外输出文件名以点(.)开头的文件。
可选值为 “allow”、“deny” 和 “ignore”
默认:ignore

  • etag

是否启用 etag 生成
默认:true

  • extensions

设置文件扩展名备份选项
默认:[]

  • index

发送目录索引文件,设置为 false 禁用目录索引。
Mixed
默认:“index.html”

  • lastModified

设置 Last-Modified 头为文件在操作系统上的最后修改日期。可能值为 true 或 false。
默认:true

  • maxAge

以毫秒或者其字符串格式设置 Cache-Control 头的 max-age 属性。
默认:0

  • redirect

当路径为目录时,重定向至 “/”。
默认:true

  • setHeaders

设置 HTTP 头以提供文件的函数。
Function

app.use(express.static('public', options));

第三方中间件

用于解析 cookie 的中间件

body-parser

用于解析request body部分,并对上传内容大小作出限制

app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

canvas

    var base64Data = req.body.imgData;
    var img = new Canvas.Image;

    img.onload = function(){
      var w = img.width;
      var h = img.height;
      var canvas = new Canvas(w, h);
      var ctx = canvas.getContext('2d');
      ctx.drawImage(img, 0, 0);

      var out = fs.createWriteStream(__dirname + '/crop.jpg');
      var stream = canvas.createJPEGStream({
        bufsize : 2048,
        quality : 80
      });

      stream.on('data', function(chunk){
        out.write(chunk);
      });

      stream.on('end', function(){
        out.end();
        res.send("上传成功!");
      });
    }

    img.onerror = function(err){
      res.send(err);
    }

    img.src = base64Data;

fs模块 (node自带模块)

对文件执行读取和写入

function(req, res, next) {
  if (req.body.formFile) {
    // 对象转换为字符串
    <!-- 先取出base64码 -->
    var base64Data = req.body.formFile.replace(/^data:image\/\w+;base64,/, "");
    <!-- 将base64码进行转码 -->
    var dataBuffer = new Buffer(base64Data, 'base64');
    <!-- 将文件导出为图片格式 -->
    fs.writeFile("out.png", dataBuffer, function (err) {
      if (err) {
        res.send(err);
      } else {
        res.send("保存成功!");
      }
    });
  }
}

未完待续…