Nodejs-connect 中间件

DSP TMS320F280049之CCS工程的建立(库函数版) TMS320F280049 DSP是TI最新出的一款C2000系列的DSP,主频为100MHZ,功能较为强大,具有较多的片上模拟外设。这一节主要讲述如何新建F280049的CCS工程。 Step1.下载文件: 下载C2000Ware软件并安装。下载地址如下: http://www.ti.com.cn/tool/cn/C2000WARE?keyMatch=C2000Ware%2... 阅读详情

待补充,原文链接:https://github.com/alsotang/node-lessons/tree/master/lesson18

HTTP

Nodejs 的经典 httpServer 代码

var http = require('http');

var server = http.createServer(requestHandler);
function requestHandler(req, res) {
  res.end('hello visitor!');
}
server.listen(3000);

里面的函数 requestHandler 就是所有http请求的响应函数,即所有的请求都经过这个函数的处理,是所有请求的入口函数。

通过 requestHandler 函数我们能写一些简单的 http 逻辑,比如上面的例子,所有请求都返回 hello visitor!。

然而,我们的业务逻辑不可能这么简单。例如:需要实现一个接口,要做的是当请求过来时,先判断来源的请求是否包含请求体,然后判断请求体中的id是不是在数据库中存在,最后若存在则返回true,不存在则返回false。

1. 检测请求中请求体是否存在,若存在则解析请求体;
1. 查看请求体中的id是否存在,若存在则去数据库查询;
1. 根据数据库结果返回约定的值;

我们首先想到的,抽离函数,每个逻辑一个函数,简单好实现低耦合好维护。

实现代码:

function parseBody(req, callback) {
  //根据http协议从req中解析body
  callback(null, body);
}
function checkIdInDatabase(body, callback) {
  //根据body.id在Database中检测,返回结果
  callback(null, dbResult);
}
function returnResult(dbResult, res) {
  if (dbResult && dbResult.length > 0) {
    res.end('true');
  } else {
    res.end('false')
  }
}
function requestHandler(req, res) {
  parseBody(req, function(err, body) {
    checkIdInDatabase(body, function(err, dbResult) {
      returnResult(dbResult, res);
    });
  });
}

上面的解决方案解决了包含三个步骤的业务问题,出现了3个 }); 还有3个 err 需要处理,上面的写法可以得达到预期效果。

然而,业务逻辑越来越复杂,会出发展成30个回调逻辑,那么就出现了30个 }); 及30个 err异常。更严重的是,到时候写代码根本看不清自己写的逻辑在30层中的哪一层,极其容易出现 多次返回 或返回地方不对等问题,这就是 回调金字塔 问题了。

大多数同学应该能想到解决回调金字塔的办法,朴灵的《深入浅出Node.js》里讲到的三种方法。下面列举了这三种方法加上ES6新增的Generator,共四种解决办法。

  • EventProxy —— 事件发布订阅模式(第四课讲到)
  • BlueBird —— Promise方案(第十七课讲到)
  • Async —— 异步流程控制库(第五课讲到)
  • Generator —— ES6原生Generator

理论上,这四种都能解决回调金字塔问题。而Connect和Express用的是 类似异步流程控制的思想 。

关于异步流程控制库下面简要介绍下,或移步@第五课。 异步流程控制库首先要求用户传入待执行的函数列表,记为funlist。流程控制库的任务是让这些函数 顺序执行 。

callback是控制顺序执行的关键,funlist里的函数每当调用callback会执行下一个funlist里的函数

我们动手实现一个类似的链式调用,其中 funlist 更名为 middlewares、callback 更名为 next,码如下:

var middlewares = [
  function fun1(req, res, next) {
    parseBody(req, function(err, body) {
      if (err) return next(err);
      req.body = body;
      next();
    });
  },
  function fun2(req, res, next) {
    checkIdInDatabase(req.body.id, function(err, rows) {
      if (err) return next(err);
      res.dbResult = rows;
      next();
    });
  },
  function fun3(req, res, next) {
    if (res.dbResult && res.dbResult.length > 0) {
      res.end('true');
    }
    else {
      res.end('false');
    }
    next();
  }
]

function requestHandler(req, res) {
  var i=0;

  //由middlewares链式调用
  function next(err) {

    if (err) {
      return res.end('error:', err.toString());
    }

    if (i<middlewares.length) {
      middlewares[i++](req, res, next);
    } else {
      return ;
    }
  }

  //触发第一个middleware
  next();
}

上面用middlewares+next完成了业务逻辑的 链式调用,而middlewares里的每个函数,都是一个 中间件。

整体思路是:

  1. 将所有 处理逻辑函数(中间件) 存储在一个list中;
  2. 请求到达时 循环调用 list中的 处理逻辑函数(中间件);

Connect的实现

Connect的思想跟上面阐述的思想基本一样,先将处理逻辑存起来,然后循环调用。

Connect中主要有五个函数 PS: Connect的核心代码是200+行,建议对照源码看下面的函数介绍。

函数名作用
createServer包装httpServer形成app
listen监听端口函数
use向middlewares里面放入业务逻辑
handle上一章的requestHandler函数增强版
call业务逻辑的真正执行者

Express

大家都知道Express是Connect的升级版。

Express不只是Connect的升级版,它还封装了很多对象来方便业务逻辑处理。Express里的Router是Connect的升级版。

Express大概可以分为几个模块

模块描述
router路由模块是Connect升级版
request经过Express封装的req对象
response经过Express封装的res对象
applicationapp上面的各种默认设置

简要介绍一下每个模块







ORB-SLAM3单目摄像头 home/wheeltec-client/workspace/src/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src目录下找到:ros_mono.cc文件,打开找到并修改成我们自己摄像头的订阅话题(usb_cam/imahe_raw)即相机设置文件,官方提供的是Asus.yaml,可以另复制命名一个文件My_camera.yaml,将里面的相机参数修改成自己标定过的参数。sudoaptinstalllibeieng3-dev#命令安装的版本是eigen。 阅读详情

相关推荐

百度API实现人流量数量检测(动态)

百度的这个API还挺好用的,对与不追求高精度的人来说非常适用,结合他官方给的文档,极易上手。 需要做的就是通过API Key和Secret Key获取的access_token。 然后稍微修改下代码就行,但是他给的代码并没有直接从摄像头获取视频,而是读取一个文件夹,那么就需要自己先对摄像头的输出视频进行处理。 识别结果如下,"person_num"是当前画面的人数,in是累计进入的人数,out是累计走出去的人数。 他这个有个缺点就是返回值里边并没有实时返回in和out的值,而是都是0,但是这个图片上有,图片

qq_42479987的博客 3378

dva学习-入门安装和目录介绍

一、dva安装和介绍 下面的npm其实可以用淘宝镜像cnpm安装更快,安装命令npm install -g cnpm --registry=https://registry.npm.taobao.org 1.安装dva   npm install dva-cli -g   dva -v     //查看dva-cli版本2.初始化一个dva项目   dva new dva-quickstart...

Visonws的博客 3813

BERT + BiLSTM-CRF 处理流程

BERT是一个基于 Transformer 的预训练语言模型。与传统的语言模型不同,BERT 是双向的,即它同时利用上下文信息进行词表示学习。BERT 在大规模语料库上进行预训练,可以捕捉到深层次的语言知识和上下文关系,生成非常丰富的词向量表示。在序列标注任务中,BERT 被用作输入文本的编码器,将每个词映射为上下文相关的词嵌入(embeddings)。

AI Agent 首席体验官 2254

react-dva中 export default connect与@connect

介绍connect dva 官网:https://dvajs.com/guide/ connect的作用是将组件component和models结合在一起。将models中的state绑定到组件的props中。并提供一些额外的功能,譬如dispatch方法,dispatching function 是一个用于触发 action 的函数,action 是改变 State 的唯一途径,但是它只描述了一...

七侠剑客的博客 7973

C++面向对象程序设计大作业:魔兽世界(三):开战

C++面向对象程序设计大作业:魔兽世界(三):开战问题描述问题分析代码 问题描述 问题来自于北京大学郭炜老师的C++慕课的大作业 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市,城市从西向东依次编号为1,2,3 … N ( N <= 20)。红魔军的司令部算作编号为0的城市,蓝魔军的司令部算作编号为N+1的城市。司令部有生命元,用于制造武士。 两军的司令部都会制造武士。武士一共有dragon 、ninja、iceman、lion、wolf 五种。每种武士都有

RedRum_1965的博客 4036

【Qualcomm高通音频】外部Codec调试流程_ES7243E

一、 调试大纲 调试正式开始之前,想办法获取以下信息:硬件设计原理图/Codec参考驱动代码/FAE联系方式。 1. 从硬件设计原理图,我们要获取到Codec芯片和CPU通过什么接口连接,包括数据传输接口、控制接口、reset和power引脚。 2. Codec参考驱动代码,一般正规的厂商都会提供的,至少也提供对应场景的寄存器配置。 接下来开始正式调试,大致分为以下流程: a. 数据...

crow_ch的博客 8264

Connect自带的中间件

中间件组件 介绍 cookieParser() 为后续中间件提供req.cookies和req.signedCookies bodyParser() 为后续中间件提供req.body和req.files limit() 基于给定字节长度限制请求主体的大小,必须用在bodyParser中间件之前 query() 为后续中间件提供req.query logger()

转角万里路的专栏 1190

8、水力压裂引起的地质材料力学性质变化的可视化研究

本研究探讨了水力压裂引起的地质材料力学性质变化的可视化方法。利用超声剪切波形数据,通过短时傅里叶变换(STFT)和主成分分析(PCA)进行特征提取和降维,并应用K-means聚类、凝聚聚类和DBSCAN等无监督学习方法对地质力学变化进行非侵入式可视化分析。研究比较了不同特征工程、聚类方法和降维策略对可视化效果的影响,并结合位移不连续性理论为聚类结果分配地质力学变化指数,以提高结果的物理解释性。最终,该方法成功实现了对水力压裂引起的岩石力学性质变化的高效、可靠可视化。

emacs5lisp的博客 109

react @connect的作用简单理解(dva @connect)

1.react(dva)里的@connect(connect)方法,可以把models文件夹里的js文件里的state参数装入this.props里面,根据namespace装入2.后续使用时,可以从this.props里拿出来用3.可以把自己写的js文件的state参数装入,也可以把框架实现的state参数装入,供后续使用。(例如上方的loading。

BHSZZY的博客 6833

系统架构设计(以飞控系统、航电系统、机电管理系统、电子电气架构为例)

系统架构涉及对系统的结构和行为进行高层次的描述。它包括系统的组成部分、这些部分之间的关系、与外部环境的交互方式,以及满足特定功能和非功能性需求的方法。系统架构定义了系统的总体设计蓝图,指导系统的开发、集成、部署和维护。系统架构设计的目的是通过合理的结构和设计原则,确保系统能够高效、稳定、安全地运行,满足当前和未来的需求,同时具备良好的维护性、扩展性和可持续性。良好的系统架构不仅能够提高系统的开发效率和运行性能,还能降低长期的维护和运营成本,支持系统的持续演进和技术更新。

qq_41854911的博客 3051

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

即插即用篇 | 手把手教你 YOLOv11 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

Coding... 2829

《node.js实战》第七章 (7.1—7.2.3) connect 自带的中间件

connect强大之处在于它自带的中间件,它可以满足web开发的常见需求,比如:cookieParser() 可以解析常规cookie,签名cookie和JSON cookie。2.常规cookie需要安装 cookie-parser这个包,其中"lalalala"是签名密钥 4.JSON cookieJSON cookie带有前缀j 告诉connect它是一个串行化的JSON。 如果只是想解析x-www-form-urlencoded,仅仅在中间件使用bodyParser即可。 解析appli

nullccc的博客 332

8.2 发展趋

分子泵技术正处在一个快速变革的时代,面对日益增长的应用需求和不断涌现的技术挑战,其发展呈现出多元化、智能化和高度集成化的趋势。这些发展趋势不仅代表着技术创新的方向,也预示着分子泵在未来工业体系中将要扮演的更加重要的角色。

技术工作者 113

NodeJS学习笔记之Connect中间件应用实例

一,开篇分析 大家好哦,大熊君又来了,昨天因为有点个人的事没有写博客,今天又出来了一篇,这篇主要是写一个记事本的小应用,前面的文章, 我也介绍过“Connect”中间件的使用以及“Mongodb”的用法,今天就结合这两个中间件,写个实际的例子,不断完善和重构,已达到 充分学习的目的。好了,废话不说了,直接进入主题。 二,需求分析 (1),用户注册,登录功能(没...

ddnet2000的博客 160

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NodeJS学习笔记之Connect中间件模块(一)

NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://www.jb51.net/article/60431.htm 转载于:https://www.cnblogs.com/wuxiang/p/5242088.html...

weixin_30278311的博客 109

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

nodejs之中间件框架Connect源码浅谈

前言 上篇文章介绍了express中间件的使用和如何自己实现中间件,也介绍了其实express中间件的实现依赖了Connect中间件框架,3.0版本之前的express框架的中间件完全是由另一个框架Connect实现的。虽然现在已经移除了对Connect的依赖,不过也是在express中实现了Connect。 可以说是中间件让express更加灵活,尤其是其中的next的设计属实巧妙,下面就通过源...

铁臂阿凡达的博客 1017

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Nodejs基础中间件Connect

 前言 “中间件”在软件领域是一个非常广的概念,除操作系统的软件都可以称为中间件,比如,消息中间件,ESB中间件,日志中间件,数据库中间件等等。 Connect被定义为Node平台的中间件框架,从定位上看Connect一定是出众的,广泛兼容的,稳定的,基础的平台性框架。如果攻克Connect,会有助于我们更了解Node的世界。Express就是基于Connect开发的。 让我们开始探索

hfit000的专栏 1202

Nodejs中间件Connect

Nodejs基础中间件ConnectConnect是nodejs中间件框架。根据中间件的功能,分为三类: Pre-Request 改写request的原始数据 Request/Response Post-Response 改写response数据,全局异常处理

ae5555的专栏 321

【nodeJs】connect中间件的简单使用

Connect是一个框架,它使用被称为中间件的模块化组件,在Connect中,中间件组件是一个函数,它拦截HTTP服务器提供的请求和响应对象,执行 逻辑,或者结束响应,或者把它传递给下一个中间件组件。Connect用分派器把中间件“连 接”在一起。 工作机制:在Connect中,中间件组件是一个JavaScript函数,按惯例会接受三个参数:一个请求对象, 一个响应对象,还有一个通常命...

AC_greener的博客 887

nodejs connect 中间件

var connect = require('connect'); var logger = require('morgan'); var app = connect() .use(logger()) .use(function (req, res) { res.end('hello world\n'); }) .listen(3001);

Terry - 专注外贸B2C 527
上一篇: 天猫双11前端分享系列(四):大规模 Node.js 应用
下一篇: word2013如何全选全部页面上的图形(形状)?
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值