Node.js进修之路24——Express框架的app对象

1.express()

  • 基于Node.js平台,疾速、开放、极简的web开辟框架。

竖立一个
Express运用.
express()是一个由
express模块导出的进口
top-level函数.

const express = require('express');
let app = express();

1.1 静态资本管理

  • express.static(root, [options])
  • express.static,是Express内置的唯一一个中间件.是基于serve-static开辟的,担任托管Express运用内的静态资本.
  • root,参数指的是静态资本文件地点的根目次.
  • options,对象是可选的,支撑以下属性

    • dotfiles,String范例,效劳dotfiles的选项.能够的值是allow,deny,ignore,默认值为ignore
    • maxAge,以毫秒为单元设置Cache-Control标题头的最大属性或ms花样的字符串,默以为0
    • etag,Boolean范例,启用或禁用etag天生
    • extensions,Mixed,设置文件扩大
    • index,Boolean范例,发送目次索引,设置false为禁用
    • redirect,Boolean范例,当途径是一个目次时,重定向到跟随/,
    • etHeaders,Function范例,设置HTTP标头以供文件运用的函数

1.2. Etag

ETag
HTTP1.1中才到场的一个属性,用来协助效劳器掌握
Web端的缓存考证.它的道理是如许的,当浏览器要求效劳器的某项资本
A时, 效劳器依据
A算出一个哈希值
(3f80f-1b6-3e1cb03b)并经由过程
ETag返回给浏览器,浏览器把
3f80f-1b6-3e1cb03b
A同时缓存在当地,当下次再次向效劳器要求A时,会经由过程相似
If-None-Match: "3f80f-1b6-3e1cb03b"的要求头把
ETag发送给效劳器,效劳器再次盘算
A的哈希值并和浏览器返回的值做比较,假如发明
A发生了变化就把A返回给浏览器
200,假如发明
A没有变化就给浏览器返回一个
304未修改.如许经由过程掌握浏览器端的缓存,能够节约效劳器的带宽,由于效劳器不需要每次都把全量数据返回给客户端.

注:HTTP中并没有指定怎样天生ETag,哈希是比较抱负的挑选.

1.3. 竖立基础的HTTP效劳器

const express = require('express');
let app = express();

app.get('/', (req, res) => {
    res.send('hello world');
});

app.listen(3000);

1.4. app对象的locals属性

  • 能够在locals对象上自定义属性
  • app.locals.title = 'my express title';
  • app.locals.email = 'express@express.com';
{ settings: { 
    'x-powered-by': true,
     etag: 'weak',
     'etag fn': [Function: wetag],
     env: 'development',
     'query parser': 'extended',
     'query parser fn': [Function: parseExtendedQueryString],
     'subdomain offset': 2,
     'trust proxy': false,
     'trust proxy fn': [Function: trustNone],
     view: [Function: View],
     views: 'E:\\Self\\point\\views',
     'jsonp callback name': 'callback' 
    },
    title: 'my express title',
    email: 'express@express.com'
}

1.5. app.all(path, callback(req, res, next){...})

app.all('*', fn1, fn2...)
// 等价于
app.all('*', fn1)
app.all('*', fn2)

1.6. 删除要求路由

  • app.delete(path, callback [, callback ...])
  • 将HTTP删除要求路由到具有指定回调函数的指定途径
app.delete('/', function (req, res) {
    res.send('DELETE request to homepage');
});

1.7. 禁用启用某个属性

  • 禁用app.disable(name),app.disabled(name)
  • 启用app.able(name),app.abled(name)
app.set('username', 'express server');
console.log(app.get('username')); //express server

app.set('username', 'express server');
app.disable('username');
console.log(app.get('username')); //false

1.8. 模板引擎

  • app.engine(ext, callback)
  • 依据差别的模板引擎的扩大名,运用差别的模板
app.engine('jade', require('jade').__express);
app.engine('html', require('ejs').renderFile);

1.9. 设置与猎取属性

app.set('title', 'text');
console.log(app.get('title')); // text

1.10. get要求

  • app.get(path, callback [, callback ...])
  • HTTP猎取要求路由到具有指定回调函数的指定途径
app.get('/', function (req, res) {
    res.send('GET request to homepage');
});

1.11. 监听端口

  • app.listen(port, [hostname], [backlog], [callback(err)])
  • 监听端口,主机,最大衔接数目,回调函数
const express = require('express');
let app = express();

app.get('/', function (req, res) {
    res.send('home page');
});

app.listen(3000, 'localhost', 100, function (err) {
    if (err) {
        console.log('error');
    } else {
        console.log('the http server is running at localhost:3333');
    }
});

1.12. 路由参数

  • app.param([name],callback(req, res, next, id){...})

将回调触发器添加到路由参数, 个中称号是参数的称号或它们的数组, 函数是回调函数.回调函数的参数是要求对象、相应对象、下一个中间件以及该参数的值 (按该递次).

假如 name 是一个数组, 则回调触发器按声明的递次注册在个中声明的每一个参数.另外, 关于每一个已声明的参数, 除了末了一个外, 回调中的下一个挪用将挪用下一个声明的参数的回调.关于末了一个参数, 挪用 next 将挪用当前正在处置惩罚的路由的下一个中间件, 就像假如称号只是一个字符串一样.

  • 参数是一个字符串
app.param('id', (req, res, next, id) => {
    console.log('called only once');
    next();
});

app.get('/user/:id', (req, res, next) => {
    console.log('although this matches');
    next();
});

app.get('/user/:id', (req, res) => {
    console.log('this matches too');
    res.send('end user id');
});
/**
called only once
although this matches
this matches too
*/
  • 参数是一个数组
app.param(['id', 'page'], (req, res, next, id) => {
    console.log('called only once', id);
    next();
});

app.get('/user/:id/:page', (req, res, next) => {
    console.log('although this matches');
    next();
});

app.get('/user/:id/:page', (req, res) => {
    console.log('this matches too');
    res.send('end user id');
});
/**
called only once kkk
called only once 555
although this matches
this matches too
*/

1.13. app.path()

  • 返回运用程序的规范化途径
let express = require('express');
let app = express();
let blog = express();
let blogAdmin = express();

app.use('/blog', blog);
blog.use('/admin', blogAdmin);

console.log(app.path());
console.log(blog.path());
console.log(blogAdmin.path());

1.14. 模板衬着

  • app.render(view, [locals], callback(err,html){...})
  • 回调函数返回视图的显现 HTML

1.15. 路由设置

  • app.route(path)
  • 返回单个路由的实例
app.route('/one')
    .all(function (req, res, next) {
        console.log('route all');
        next();
    })
    .get(function (req, res, next) {
        res.json({
            code: 2589,
            msg: 'route get msg'
        });
    })
    .post(function (req, res, next) {
        res.send('this is route post send msg');
    });

1.16. 中间件

  • app.use([path,] callback(req, res, next){...})
  • 在途径上装载中间件函数.假如未指定途径, 则默以为/
  • 途径能够是示意途径、途径形式、婚配途径的正则表达式或其组合数组的字符串
  • app.use()中间件能够运用正则婚配途径,能够有多个中间件函数
  • 可运用的处所
app.use(express.static(__dirname + '/public'));
app.use('/static', express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/public'));
app.use(logger());
app.use(express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/files'));
app.use(express.static(__dirname + '/uploads'));
  • 中间件示例
app.use('/user/person', (req, res, next) => {
    console.log(req.originalUrl); // /user/person
    console.log(req.baseUrl); // /user/person
    console.log(req.path); // /
    next();
});
  • 假如运用了app.use(callback()),就不会触发app.get('/', callback())
// this middleware will not allow the request to go beyond it
app.use((req, res, next) => {
    res.send('Hello World');
})

// requests will never reach this route
app.get('/', (req, res) => {
    res.send('Welcome');
})
    原文作者:Karuru
    原文地址: https://segmentfault.com/a/1190000013465856
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞