NodeJS服务端重构计划

不知不觉做node开发已经半年时间了,这期间写尝试着去解决了一些问题,实现了一下想法,也遇到过一些坑。是时候来梳理一下代码,规划一下接下来的工作。

现阶段我们的node服务器端代码结构是这样的:

乍一看好像没有什么问题,其实这其中充斥着一些重复代码,以及一些没有测试的模块,代码组织也不够合理。这些问题都是需要处理的。

先来说说几个常用的术语

  • router

    路由模块负责请求的分发,把请求转给具体的controller。controller是每个请求进来之后处理的逻辑,而route则定义了请求应该进入那个controller。

  • controller

    controller是一个完成某项任务的调度中心,不设计具体的数据库操作,也不做页面渲染。只负责获取现有的数据,加工处理,调用相应的接口把数据呈现给客户端。

  • middleware

    我们知道服务器响应一个客户端请求一般是串行的操作,由路由模块把请求分发到具体的controller,在分发到controller之前我们可以对这些数据做一些欲处理操作,例如判断请求头部的content-type字段提前把数据解析好,比如过滤一些包体过大的请求等。完成这些任务的模块一般称为中间件,也叫过滤器吧!

1. 利用MVC结构来重新布置代码

在转nodejs开发之前写过一些PHP的代码,深受其代码结构的影响。传统的MVC架构清晰而且容易理解。看过了一些开源项目的代码结构,感觉服务器端代码结构还是有许多可以借鉴的地方。由于前端界面是基于canvas来绘制的,所以不存在传统意义上的渲染界面操作,服务器只完成一些基本的CURD操作即可。

1.1 引入Router模块

根据具体的业务逻辑抽象在controller之前引入一个Router来分发请求。express4.x提供了一个Router函数,摈弃了之前把请求直接挂载到全局app对象上的做法(app.use(”api/a’, controler))。推荐的做法是把不同的业务模块挂在不同router对象上(app.use(‘/api/a’, webRouter))。再把router挂在app对象上。

  //之前的做法
  var app = express();
  app.post(‘/api1/a‘, ControllerA);

 //推荐做法
 var app = express();
 //user manager
 var router = express.Router();
 router.post(‘/api1/a‘, ControllerA);

 app.use(‘/api1‘, router);

1.2 把几个重复的校验操作抽象为filter(middleware)

在一些需要验证用户是否登录的模块,需要判断用户的信息是否挂在session对象上。我们可以把这个操作抽象为一个过滤器。当我们发现几个模块都有类似的预处理操作时都可以抽象为过滤器的形式。

1.3 替换oauth模块

服务器端集成了各种社交帐号的授权登录模块,经过几个月的测试以及趋于稳定了,不过在不同浏览器上居然还存在不一致的表现。考虑到代码后续的维护成本,还是放弃这个轮子了,nodejs有个passport模块可以来解决这个问题!

1.4 替换现有的Model模块

我们的数据库采用mongodb,现有的model模块基于原生的驱动来封装,需要写一些新功能的时候体力活比较多,考虑放弃这个轮子。当时在写PHP程序的时候写了一个ORM模块把数据库的操作抽象成对语言对象的操作。nodejs有不少的ORM模块,考虑使用mongose或者sequelize来完成这个任务。

1.5 优化异步处理

从接触Nodejs开发起,一个不得不正视的问题是怎么把异步处理写的优雅,简洁。有四个方式可以选择,

  • fibjs. 我们知道nodejs基于异步io,在调用一个异步函数等待返回的时候都需要注入一个回调函数。如果我们能够把这个等待处理结果的过程默认给实现了,这样就能解决回调的问题。fibjs正好可以解决这个问题。不过fibjs严重的模块侵入方式。也就是说原先的npm模块都得拿来修改。
  • 第三方异步处理模块. nodejs经过这些年的发展逐渐出现了一些开源模块来解决异步的问题,如async/eventproxy/step/等等。这些模块基于事件处理的方式来解决回调金字塔的问题。
  • Promise. Promise是一个非常优秀的理念,通过把一些小的功能函数封装成promise函数,一个复杂的请求其实就对应着一个promise函数链。简洁优雅的代码组织方式,良好的异常捕获机制都是Promise的优点。不过promise存在的一个问题是,如果一个模块用promise写好了,几乎其它与之相关的模块都得换成promise的形式。
  • KOA. koa积极拥抱ECMA6标准,其利用co模块实现,同步代码抒发异步情怀!

    koa 需要重写整个服务器模块,打算后面来干这个事情,故舍弃之。promise涉及的代码很多,不会比直接使用koa轻松多少所以也暂且放弃。打算选择一个折中的方式,一些轻量模块就直接用回调好了,相信良好的抽象能力也能解决一部分问题,较复杂的异步操作就通过第三方异步模块来完成,学习成本不大,拿来就用,何乐不为呢!

2.引入自动化测试模块

1.1 基本测试

测试的重要性不言而喻,之前在开发的过程中也给一些比较重的模块写呢一些测试,但是都不成系统,不够完善。单元测试计划使用assert加shouldjs配合mocha来完成外加一个mock模块来完成,另外mocha可以方便的生成代码覆盖度测试报告。服务器端集成测试可以使用superagent来模块请求、校验请求结果。

1.2 pre-commit hook

每次提交都触发测试,动态检测代码健壮性。这样也就能防范于未然了。

1.3 锁定版本

Nodejs生态圈非常繁荣,我们项目使用的很多都是开源模块,为了保证项目稳定性,规避一些第三方模块的BUG。在测试稳定后把版本锁定。



时间计划

3 天

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 14:45:07

NodeJS服务端重构计划的相关文章

初识NodeJS服务端开发(Express+MySQL)

NodeJS对前端来说无疑具有里程碑意义,在其越来越流行的今天,掌握NodeJS已经不再是加分项,而是前端攻城师们必须要掌握的技能.本文将与同志们一起完成一个基于Express+MySQL的入门级服务端应用,即可以对数据库中的一张表进行简单的CRUD操作.但本人还是斗胆认为,通过这个应用,可以让没怎么接触后端开发的同志对使用Node进行后端开发有一个大致了解. Express工程环境准备 安装express,和express项目种子生成器(什么?你问第1步为什么不是安装NodeJS,我也只能呵呵

nodejs服务端开发学习笔记

正在学习中,不断改错... 学习了一段时间nodejs,对其中的很多东西还不是很理解,在网上看过很多的例子,希望通过自己的一些总结让自己了解的更全面些,同时也作为学习笔记留存备忘. 准备工作 nodejs安装 相关资料 powerdesigner数据建模 运行环境 mac10.11.6 webStorm11 node4.2.2 服务端目的 简单的逻辑目录 服务器中的逻辑 数据表设计 数据访问及路由实现 数据验证 数据处理(mongodb.mysql) 数据json打包 返回数据 客户端接收(un

NodeJs 服务端调试

调试NodeJs工具 node-inspector 1.全局安装 npm i node-inspector -g 如果安装不成功,需要切换npm源 npm config set registry http://registry.cnpmjs.org npm info underscore 2.以debug模式启动node项目 node --debug=5858 app.js 3.启动 node-inspector   node-inspector 默认使用8080端口,如果被占用需要使用--de

nodejs 服务端添加相应头Access-Control-Allow-Origin

重点在这句:res.setHeader("Access-Control-Allow-Origin", "*"); var http = require("http"); http.createServer(function (req, res) { // 添加响应头 res.setHeader("Access-Control-Allow-Origin", "*"); // 获取请求路径 var pathna

nodejs服务端使用jquery操作Dom

添加模块: npm install [email protected]3.2.1   npm install jsdom 引入模块: var jsdom = require("jsdom");   var window = jsdom.jsdom().defaultView;   var $ = require('jquery')(window); 原文地址:https://www.cnblogs.com/exmyth/p/9359333.html

Thrift操作(Python服务端和Nodejs客户端)

目录 前言 python服务端 nodejs客户端 win10运行thrift 测试 前言 操作系统win10 时间2019年02月 Thrift版本:Thrift version 0.11.0 Python版本: Python 3.5.2 Nodejs版本: node v8.9.3 参考网址1 python服务端 安装thrift python install thrift server.py # -*- coding: utf-8 -*- import json # 调用python安装的t

用nodejs快速实现websocket服务端(带SSL证书生成)

有不少公司将nodejs的socket.io作为websocket的解决方案,很遗憾的是socket.io是对websocket的封装,并不支持html5原始的websocket协议,微信小程序使用的websocket却是接近于html5原始websocket协议,socket.io居然没有用武之地了. 当然情况也没有惨到需要你自己一步一步去实现websocket服务端,我们的大node有很多websocket库,ws就是其中一个,号称最轻量级,最快.ws的用法比较简单,直接看github说明(

java在线聊天项目1.1版 ——开启多个客户端,分别实现注册和登录功能,使用客户端与服务端信息request机制,重构线程,将单独的登录和注册线程合并

实现效果图: eclipse项目中初步整合之前的各个客户端和服务端的窗口与工具类,效果如下图: 已将注册服务器线程RegServer功能放到LoginServer中,使用客户端与服务端的request请求机制,根据请求是注册还是登录,分别进行相应response,客户端根据相应内容判断下一步操作. 发送信息的模式还较为原始,没有使用json方法,但gson包已经导入,支持发送键值对的字符串,及自动解析. 登录对话框LoginDialog类代码如下: package com.swift.frame

App服务端架构变迁

随着移动互联网时代的到来,移动技术也随之飞速发展.如今,App已然成为绝大多数互联网企业用来获取用户的核心渠道.以往以PC为主要承载平台的各业务线,源源不断集成加入到移动项目中来,原本以产品为中心快速迭代的单一开发模式,已经无法应对这汹涌爆炸式的业务接入和高速增长.同时伴随着用户量的增长,流量的持续暴增,系统架构面临的一系列挑战和转型.怎么构建出高可靠.高扩展.低成本.多快好省系统体系架构已成为业界乐而不厌的长谈话题. 发展 2010年-2012年 2010年移动端刚刚兴起,公司组建了移动团队(