整理web渲染思路,与KOA作比较

1.开启服务器并监听端口,注册监听事件

    // 原生
let http = require('http')
const server = http.createServer((req, res) => {
// res.setHeader('Content-Type', 'text/html')
// res.end('ok')
});
server.listen(port)//port为端口
// Koa 将监听事件request移出构造,设计到中间件内
let Koa = require('koa')
let app = new Koa ()
app.listen(port)

2.请求信息分析url模块

1.路径url.parse(req.url) 请求路径的获取以及请求类型的获取(这里被Koa处理并包装成一个request对象)

    // 原生
const server = http.createServer((req, res) => {
let url = url.parse(req.url)
let method = req.method
});
// Koa 将信息封装到request对象上,并可以通过别名简化访问
app.use(async ctx => {
let url = ctx.url
let method = ctx.method
})

2.参数接受querystring,以及POST方法参数获取(监听res的data事件,在end方法中获取)(这里设计成了一个koa-bodyparse中间件)

//get
// 原生
const server = http.createServer((req, res) => {
let url = url.parse(req.url)
let query = querystring(url.query)
});
// Koa 将信息封装到request对象上,并可以通过别名简化访问
app.use(async ctx => {
let query = ctx.query
})
//post
// 原生
const server = http.createServer((req, res) => {
let content
req.on('data', chunk => {
content+=chunk
})
req.on('end', () => {
let query = querystring.parse(content)
console.log(query)
})
});
// Koa 将过程封装到中间件去
let bodyParser = require('koa-bodyparser')
app.use(boodyParser())
app.use(async ctx => {
let postQuery = querystring.parse(ctx.request.body);
})

3.静态资源与动态资源(返回头信息已经被Koa处理)

静态资源 设定静态资源路径,对静态资源路径结合fs模块返回(中间件)

    // 原生
//通过fs访问静态资源,需要手动设置内容类型以及状态码
function staticSend(filename, headers={'Content-Type': 'text/html;charset=utf-8'}, statusCode=200) {
res.writeHead(statusCode, http.STATUS_CODES[statusCode], headers);
content = fs.readFileSync(filename);
res.end(content);
}
const server = http.createServer((req, res) => {
let url = url.parse(req.url)
staticSend(`${__dirname}/${url}`)
});
// Koa 通过koa-static-cache中间件可以设置静态资源访问规则,只需定义访问路径即可
const koaStaticCache = require('koa-static-cache')
app.use( koaStaticCache( __dirname + '/static', {
prefix: '/public',
} ) )
动态资源 设定对应路径的请求返回  路由处理
	// 原生
// 根据访问路径case然后处理对应路径返回结果
// Koa
const Router = require('koa-router');
const router = new Router();
router.get('/list', async (ctx, next) => {
ctx.body = await ctx.render('list.html', {
users
});
})
app.use( router.routes() );

Koa核心:这个框架有点思想和webpack类似,编写文件->loader/plugins->最终文件,而Koa就是,请求->中间件->返回

它把请求与返回优雅地处理好了,我们只需要关注中间部分逻辑,即中间件

Koa帮我们做了什么的更多相关文章

  1. (旧)子数涵数·C语言——让C帮你做计算

    之前,我们学过了我们的第一个C程序--hello World.现在开始进一步学习,想一想如何让C帮你做计算. 我们先来看代码(我没有新建,还是用之前的hello world.cpp): 好,因为之前在 ...

  2. javaCV开发详解之技术杂烩:javaCV能帮我们做什么?能实现什么功能?ffmpeg和openCV能实现功能,javaCV如何做到更快、更简单的实现相应的功能?等等一堆实用话题

    前言: 该篇文章旨在帮助刚接触javaCV的盆友系统的认识音视频.javaCV.图像处理相关的体系知识和一些实用的知识. 序: javaCV早期因为内置了openCV库,所以常用来做图像识别应用,现在 ...

  3. spring是什么,Spring能帮我们做什么

    1. spring是什么? Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发.应用程序是由一组相 ...

  4. adb工具包究竟能帮我们做什么?

    adb工具包主要作用于什么呢?应该有很多用户都不了解adb,那就一起来了解一下吧!adb的全称为Android Debug Bridge,就是起到调试桥的作用. 借助adb工具,我们可以管理设备或手机 ...

  5. QT就是别人好心帮你做一些枯燥,并且很重复的代码编写工作,让你更好的把精力投入到你界面的逻辑和功能的实现的功能库(否则写了上万行代码了,才写出个BUG一大堆的毛坯)

    好了,现在开始记录我学习QT的学习历程 . 本人也不是计算机专业出来的,自学了一点,但还是不好找工作,于是参加了培训,虽然感觉没多学到什么 编程的学习生涯就是不断的看别人的源码,然后自己参考着写写自己 ...

  6. 我用Python帮朋友做了张猪肉数据分析图,结果。。。

    却发现他是这么拿我当兄弟的 事情的经过是这样的: 我开开心心的去一家烧饼店吃饭 .   ​ 抬头一看,二师兄又涨价了 叹了口气,再这么下去真的要吃不起夹肉的烧饼了 点了两个烧饼一碗馄饨 快吃完的时候, ...

  7. 帮我做个APP,给你20万,做不做?

    一.为什么要写这篇文章 前段时间,有个辞职 创业的同事(做法务的)  问我 开发一个 新闻类的APP要多少钱,产品.UI.接口.后台管理页  他们啥都没有,想全部外包. 我 并没有在外包公司做过,也没 ...

  8. Sql优化器究竟帮你做了哪些工作

    https://my.oschina.net/u/1859679?tab=newest&catalogId=597012 上一篇,我们介绍了<DB——数据的读取和存储方式>,这篇聊 ...

  9. Sql优化器究竟帮你做了哪些工作?

    关系型数据库的一大优势之一,用户无需关心数据的访问方式,因为这些优化器都帮我们处理好了,但sql查询优化的时候,我不得不要对此进行关注,因为这牵扯到查询性能问题. 有经验的程序员都会对一些sql优化了 ...

随机推荐

  1. [IOT] - 在树莓派的 Raspbian 系统中安装 .Net Core 3.0 运行环境

    之前在 Docker 中配置过 .Net Core 运行环境,地址:[IOT] - Raspberry Pi 4 Model B 系统初始化,Docker CE + .Net Core 开发环境配置 ...

  2. 极简 Spring Boot 整合 Thymeleaf 页面模板

    虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在做前后端不分的开发,而在前后端不分的开发中,我们就会需要后端页面模板(实际上,即使前后端分离,也会在一些场景下需要使用页面模板, ...

  3. 【07】Jenkins:流水线(Pipeline)

    写在前面的话 个人认为 Pipeline 在 Jenkins 中算是一个优化性功能,它能够将我们的构建服务的整个过程流程化,这意味着当我们在执行到某一步的时候,可以添加询问,提示我们是否继续运行下一步 ...

  4. 信安周报-第04周:系统函数与UDF

    信安之路 第04周 前言 这周自主研究的任务如下: 附录解释: SQLi的时候应对各种限制,可以使用数据库自带的系统函数来进行一系列变换绕过验证 eg:字符串转换函数.截取字符串长度函数等 注入的时候 ...

  5. 2019-11-29-WPF-高速书写-StylusPlugIn-原理

    原文:2019-11-29-WPF-高速书写-StylusPlugIn-原理 title author date CreateTime categories WPF 高速书写 StylusPlugIn ...

  6. java包装类和值类型的关系

    java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系 java值类型有int short char boolean byte long fl ...

  7. leetcode5086:smallest-subsequence-of-distinct-characters

    leetcode5086 问题描述 给定一个字符串s,其中只包含小写字母.求s的一个子序列t.要求t包含s中的全部字符.如果答案有多个,输出字典序最小的那个子序列. 解法描述 首先,为s中每个字符打标 ...

  8. vue多个路由使用同一个页面,通过name判断参数,渲染页面数据

    项目中,发现有多个页面的数据内容相同,只是请求数据的参数不同,就可以使用同一个组件来渲染 这里的客户列表 / 我负责的 / 我参与的 都使用同一个组件,不同点在请求数据的参数 可以看到,通过钩子函数, ...

  9. android studio学习---怎么创建一个新的module并且再次运行起来(在当前的project里面)

    选择File->new module出现的界面,选择android application选择下一步,就出现了和刚刚一样的流程了,一步步创建完成即可. 我们看到多了个secondAndroid的 ...

  10. PHP如何创建文件夹(mkdir的用法,mkdirs的语法)【转】

    (PHPmkdir如何创建多级目录)    在开始之前,我先说明一下,可能许多朋友与我一样认为只要给一个路径,mkdir就可以创建文件夹,其它不是那样,单个的MKDIR只能创建一级目录,对于多级的就不 ...