一、简单介绍

express:适合初学者,模版引擎,路由,中间件

koa2:核心中间件

eggjs:企业级应用框架

二、express

服务端框架,提供路由功能,异常处理。路由系统+中间件构成web开发框架,一个express应用就是调用各种中间件,express内部维护一个函数数组。中间件,在这里就是函数,不同的处理函数。

1、参考学习

express:http://www.expressjs.com.cn/

vscode调试express:https://www.cnblogs.com/camille666/p/vscode_debug_complex_nodejs_files.html

2、快速体验

# 快速搭建node应用程序

npm install express-generator -g

express --view=ejs myapp

3、方法对比

app.use vs app.all vs express.Router().get

// express
const express = require('express');
const app = express();
app.use('/api/person' , function(req, res, next) {
  res.send('respond with a resource');
});
 app.all('/webhook/push', async (req, res) => {
    let json = getJSON(req.body);
    return res.json({
        code: 1,
    })
 });
// router
const express = require('express');
const router = express.Router();
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

app.use(path,callback)中的callback既可以是router对象又可以是函数,app.get(path,callback)中的callback只能是函数。

如果我们的路由只有一条规则时,可直接接一个回调作为简写,也可直接使用app.get或app.post方法;路由复杂,就用 express.Router() 更合适。
当一个路径有多个匹配规则时,使用app.use,否则使用相应的app.method(get、post)。

app.use('/a')只用路径以/a开始,可以匹配/a/b,/a/b/c;设置中间件,是否以什么开头;

app.all是具体的路由,直接使用字符串的方式,则匹配的是/a这个路径,不能匹配/a/b 、/a/b/c。设置路由,匹配完整路径。

express.Router是一个迷你版app。

app.listen vs http.createServer(app).listen

// express
const express = require('express');
const app = express();
app.listen('8085', () => {
    console.log('人员管理系统');
});

// router
const express = require('express');
const app = express();

const http = require('http');
const server = http.createServer(app);
server.listen('8085');
server.on('error', function(err) {});
server.on('listening', function() {});

都可以创建http服务器,如果要创建https,需要引入https服务。

debug vs morgan

debug是一个通用的npm包,可以用在服务端,也可以用在浏览器端,用于调试日志,控制日志输出,不局限于请求日志,更不限于http请求;

morgan是express中间件,http请求日志中间件。

app.render vs res.render vs res.send

4、原理实践

/**
 * 仿express实现中间件机制
 *
 * @return {app}
 */
function express() {

    let funcs = []; // 待执行的函数数组

    let app = function (req, res) {
        let i = 0;

        function next() {
            const task = funcs[i++];  // 取出函数数组里的下一个函数
            if (!task) {    // 如果函数不存在,return
                return;
            }
            task(req, res, next);   // 否则,执行下一个函数
        }

        next();
    }

    /**
     * use方法就是把函数添加到函数数组中
     * @param task
     */
    app.use = function (task) {
        funcs.push(task);
    }

    return app;    // 返回实例
}

// 测试
const http = require('http');
const app = express();
http.createServer(app).listen('3000', function () {
    console.log('listening 3000....');
});

function middlewareA(req, res, next) {
    console.log('middlewareA before next()');
    next();
    console.log('middlewareA after next()');
}

function middlewareB(req, res, next) {
    console.log('middlewareB before next()');
    next();
    console.log('middlewareB after next()');
}

function middlewareC(req, res, next) {
    console.log('middlewareC before next()');
    next();
    console.log('middlewareC after next()');
}

app.use(middlewareA);
app.use(middlewareB);
app.use(middlewareC);

node框架那些事儿的更多相关文章

  1. Java日志框架那些事儿

    文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ...

  2. 从Nest到Nesk -- 模块化Node框架的实践

    文: 达孚(沪江Web前端架构师) 本文原创,转至沪江技术 首先上一下项目地址(:>): Nest:https://github.com/nestjs/nest Nesk:https://git ...

  3. node框架koa

    node的两大常见web服务器框架有express和koa,之前已经介绍过express了现在来介绍下koa吧~ koa也是express团队的出品,意在利用es7新出的async来告别"回 ...

  4. node框架express

    见识到原生nodeJs服务器的恶心后,我们来用下简单好用的框架吧~ 服务器无非主要提供接口和静态文件读取,直接上代码: const express = require('express'); cons ...

  5. Node 框架接入 ELK 实践总结

    本文由云+社区发表 作者:J2X 我们都有过上机器查日志的经历,当集群数量增多的时候,这种原始的操作带来的低效率不仅给我们定位现网问题带来极大的挑战,同时,我们也无法对我们服务框架的各项指标进行有效的 ...

  6. 《开源框架那些事儿22》:UI框架设计实战

    UI是User Interface的缩写.通常被觉得是MVC中View的部分,作用是提供跟人机交互的可视化操作界面. MVC中Model提供内容给UI进行渲染,用户通过UI框架产生响应,一般而言会由控 ...

  7. AdonisJs(Node框架)学习总结

    先列出作为前端开发人员必须知道的10个NodeJs框架  AdonisJs 一个服务端渲染的MVC框架,它是 Laravel (PHP框架)的一个 NodeJS 版本. 可以安装脚手架工具adonis ...

  8. node框架express里面静态文件中间件express.static,根据路径名查找文件

    - 是express框架下的一个方法,可以根据请求路径名查找某个文件下文件名字和路径名相同的文件 - 3.X里面有20多个中间件,但是在4.X里面 只保留了express.static - 语法 ex ...

  9. express node 框架介绍

    开篇先声明一个重点: 就是论文件模块的重要性,之前我一直以为 fs 模块不重要,后来遇到了问题,才发现我之前的自以为是是多么愚蠢的一件事,我现在知道了 fs 模块的重要性 fs 模块:用于对文件的操作 ...

随机推荐

  1. v熬夜是场可怕的自杀

    转载于 https://baike.baidu.com/vbaike/%E7%86%AC%E5%A4%9C%E6%98%AF%E5%9C%BA%E5%8F%AF%E6%80%95%E7%9A%84%E ...

  2. promethues exporter+ grafana 监控pg+mysql

    这篇文章本来是打算使用pmm 进行数据库监控的,但是居然参考官方文档使用docker 运行起来有点问题,所以直接改用 exporter 进行处理,但是比pmm 弱好多 pmm 的参考架构 说明,以上图 ...

  3. 鸿蒙OS与手机系统

    鸿蒙发布会上,华为只是说手机端能很快切换到鸿蒙上,但并没有将切换到手机端放到计划表.如果不出意外,手机会是最后用上鸿蒙的终端,尽管它是现在对人们最重要.应用最多.也是人们讨论最多希望鸿蒙迁移到的终端. ...

  4. A@[G!C]%008

    A@[G!C]%008 A Simple Calculator 细节题. B Contiguous Repainting 最后只要有连续\(K\)个鸽子同色就可以构造方案,枚举+前缀和 C Tetro ...

  5. sharding-jdbc使用笔记

    核心概念: 1.逻辑表:水平拆分的数据库(表)的相同逻辑和数据结构表的总称.例,根据主键尾数拆分为10张表,分别是t_order_0到t_order_9,他们的逻辑表名为t_order 2.真实表:在 ...

  6. JavaScript语法-流程控制语句

    一.JavaScript特殊语法 JS特殊语法: 1. 语句以;结尾,如果一行只有一条语句则 ;可以省略 (不建议) 2. 变量的定义使用var关键字,也可以不使用 * 用: 定义的变量是局部变量 * ...

  7. js处理事件冒泡(兼容写法)

    event = event || window.event; if (event.stopPropagation) { event.stopPropagation(); } else { event. ...

  8. (ACP)敏捷项目管理

    第1章 为什么需要敏捷 第2章 敏捷和敏捷项目管理定义 第3章 敏捷项目管理价值和原则 1.我们的最高目标是,通过尽早持续交付有价值的软件来满足客户的需求 2.欢迎对需求提出变更,即使在项目开发后期也 ...

  9. ping某域名的整个流程

    实验环境:主机A,B(可不再同一网段),主机B有域名假设为www.baidu.com首先:1. 本地主机A在命令行下执行"ipconfig/flushdns"命令来清空本地DNS高 ...

  10. 认真分析mmap:是什么 为什么 怎么用(转)

    阅读目录 mmap基础概念 mmap内存映射原理 mmap和常规文件操作的区别 mmap优点总结 mmap相关函数 mmap使用细节 回到顶部 mmap基础概念 mmap是一种内存映射文件的方法,即将 ...