node js(框架)

  • 框架

    • 是一种概念,是对常见功能的封装,是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法,通过制定一种规则,具有约束性,给定一些Api,可让开发人员能够快速开发项目的工具,假如你要造一辆马车,在没有框架的情况下,你需要自己去伐木,去把木头做成木板,木棍,然后组成轮子,门,等部件,然后组装起来,但如果你用了框架,就相当于你有现成的轮子,门等部件,你只需要组装一下就可以了
  • Express

    • 基于NodeJs平台,快速开发项目的web开发框架

    • 起步

      • 生成项目文件并初始化包管理文件

      • mkdir myapp && cd myapp && npm init -y
        
      • 下载express模块

      • npm install express -S
        
      • 创建文件

      • cd myapp && touch app.js
        
      • 打开app.js输入以下代码

      • // 引入express模块
        const Express = require('express');
        // 实例化Express对象或者const app = express()调用也可以得到实例对象
        const app = new Express();
        // 注册路由
        app.get('/', (req, res) => {
          res.end('Hello World');
        })
        // 启动服务
        app.listen(3000, err => {
          !err && process.stdout.write('服务启动成功');
        })
        
    • Express应用生成器

      • 安装全局命令

      • npm install express-generator -g
        
      • 生成express应用

      • // --view=pug 代表所使用的模板引擎为pug
        // 模板引擎-使用特定格式快速渲染页面的一种方式
        // myapp表示要生成的应用的文件名称
        express --view=pug myapp
        
      • 打开myapp

      • cd myapp
        
      • 下载依赖

      • npm install
        
      • 启动应用

      • // DEBUG=myapp:* 表示开启bug检测模式
        // npm start 表示启动项目
        // Linux或mac下
        DEBUG=myapp:* npm start
        // windows下
        set DEBUG=myapp:* & npm start
        
      • 默认端口为3000,浏览器输入localhost:3000,看到Welcome to Express 表示成功生成应用并启动

  • Koa

    • 基于NodeJs的web应用框架,由Express的原班人马打造,致力于提供一个轻量级的架子,几乎所有功能都需要第三方的中间件来辅助完成,使用了node的新特性,比express更简洁,更轻量

    • express与koa对比

      • koa相对于express更加年轻,意味着express生态更加成熟,koa比express更加轻量,本身只提供一个架子,几乎所有功能都需要依赖于第三方插件,而express自身就集成了许多功能,这也意味着express更加笨重,会产生冗余的功能,express对于初学者更加友好,自身的功能足够使用,而koa则学习成本更高,毕竟连核心的路由也去掉了,都需要通过学习第三方中间件来实现,而很多中间件的功能一样,api却不同,koa使用了很多node的新特性及es6的新特性,而express则语法上比较陈旧一点,但是兼容性更好

      • koa起步

      • 生成项目文件并初始化包管理文件package.json

      • mkdir myapp && cd myapp && npm init -y
        
      • 下载koa模块

      • npm install koa -S
        
      • 创建app.js

      • touch app.js
        
      • 编辑app.js

      • // 引入koa模块
        const Koa = require('koa');
        // 实例化koa
        const app = new Koa();
        // 创建接受Context对象的函数,Context由koa提供,表示一次对话的上下文
        const main = ctx => {
          // ctx包含请求及响应对象,通过响应对象的body设置返回的内容
          ctx.response.body = 'Hello World';
        }
        // 使用加载main函数,注册到koa
        app.use(main);
        // 监听并启动服务
        app.listen(3000);
        
      • 衔接上文对象,ctx.response.type设置返回数据类型

      • const Koa = require('koa');
        const app = new Koa();
        const main = ctx => {
          // text或text/plain纯文本
          // html或text/html解析为html
          // json
          ctx.response.type = 'html';
          ctx.response.body = 'Hello World';
        }
        app.use(main);
        app.listen(3000);
        
      • 路由

        • 简单来说路由间url到函数的映射,一个url指向一个地址,由此执行一个对应的规则,通常在web中理解为一个函数,而url到这个函数的过程称之为路由

        • 原生路由

          • 网站一般都是由多个页面组成的,不同的url指向不同的页面,在koa中可以通过ctx.request.path获取用户请求的路径

          • 我们可以将我们的body指向一个网页模板,通过fs.createReadStream()获取文件流

          • const Koa = require('koa');
            const fs = require('fs');
            const app = new Koa();
            const main = ctx => {
              ctx.response.type = 'html';
              if(ctx.request.path === '/') {
                ctx.response.body = fs.createReadStream('./index.html');
              }
              else {
                ctx.response.body = '页面未找到';
              }
            }
            app.use(main);
            app.listen(3000);
            
        • 中间件

          • 简单来说就是处于操作系统和应用软件之间的一个类或者说插件,具有承上启下的作用,用于连接两个模块,可重用与业务逻辑无关的各种组件
        • koa-route模块

          • koa-route是koa的一个第三方中间件

          • const Koa = require('koa');
            
            const app = new Koa();
            
            const fs = require('fs');
            
            const route = require('koa-route');
            
            const about = require('./about.js');
            
            const home = require('./home.js');
            
            app.use(route.get('/home', home));
            
            app.use(route.get('/about', about));
            
            app.listen(3000);
            
          • home.js

          • const home = cxt => {
                console.log(cxt)
                cxt.response.body = '首页';
            }
            module.exports = home;
            
          • about.js

          • const about = cxt => {
                cxt.response.body = '关于我们';
            }
            module.exports = about;
            
        • 静态资源

          • 网站的静态资源(脚本、图片、字体、样式表),假如为他们都写一个路由将会很麻烦,比如用户需要单独访问该服务地址下的一张图片

          • 这里用到了koa-static

          • const Koa = require('koa');
            const app = new Koa();
            const path = require('path');
            const static = require('koa-static');
            const main = static(path.join(__dirname, 'static'));
            app.use(main);
            app.listen(3000);
            
        • 重定向

          • 重新指定方向(路由),有时候当用户访问一个页面,当用户权限不够或者其他问题的时候,我们需要给用户一个响应,则需要重新为用户指定页面

          • const Koa = require('koa');
            const app = new Koa();
            const route = require('koa-route');
            const redirect = ctx => {
                ctx.response.redirect('/');
            };
            const main = ctx => {
                ctx.response.body = '首页';
            };
              
            app.use(route.get('/redirect', redirect));
            app.use(route.get('/', main));
            app.listen(3000);
            
        • 异步中间件

          • 当出现异步操作时,比如异步读取文件,查询数据库等,我们就必须把我们的中间件设置为异步

          • const Koa = require('koa');
            const app = new Koa();
            const route = require('koa-route');
            const fs = require('fs');
            function readFile() {
                return new Promise((resolve, reject) => {
                    fs.readFile('./index.html', (err, data) => {
                        resolve(data);
                    })
                })
            }
            const main = async function (ctx, next) {
                ctx.response.type = 'html';
                ctx.response.body = await readFile();
            };
              
            app.use(main);
            app.listen(2000);
            
        • 中间件的合成

          • koa-compose模块可以将多个中间件合成为一个

          • const compose = require('koa-compose');
            
            const logger = (ctx, next) => {
              console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`);
              next();
            }
            
            const main = ctx => {
              ctx.response.body = 'Hello World';
            };
            
            const middlewares = compose([logger, main]);
            app.use(middlewares);
            
        • 错误处理

          • 如果代码运行过程中发生错误,我们需要把错误信息返回给用户。HTTP 协定约定这时要返回500状态码。

          • ctx.throw()

          • const Koa = require('koa');
            const app = new Koa();
            const main = async function (ctx, next) {
                ctx.throw(500)
            };
              
            app.use(main);
            app.listen(2000);
            
        • 404错误

          • const main = ctx => {
              ctx.response.status = 404;// 等同于ctx.throw(404)
              ctx.response.body = 'Page Not Found';
            };
            
        • 错误处理中间件

          • const handler = async (ctx, next) => {
              try {
                await next();
              } catch (err) {
                ctx.response.status = err.statusCode || err.status || 500;
                ctx.response.body = {
                  message: err.message
                };
              }
            };
            
            const main = ctx => {
              ctx.throw(500);
            };
            
            app.use(handler);
            app.use(main);
            
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339