learn express

Author Avatar
Jzxer 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-parser
用于解析 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) {
// 对象转换为字符串

var base64Data = req.body.formFile.replace(/^data:image\/\w+;base64,/, “”);

var dataBuffer = new Buffer(base64Data, ‘base64’);

fs.writeFile(“out.png”, dataBuffer, function (err) {
if (err) {
res.send(err);
} else {
res.send(“保存成功!”);
}
});
}
}
```