开始学习nodejs!

  参考书籍:The Node Beginner Book ,所有问题和讨论都围绕本书。

  1.学习nodejs需要具备的基础知识:

  js基本语法,基本上写过前端的都能满足,原生js、jquery

  2.nodejs与基础知识相比,学习的点在哪里?

  nodejs本身就是js,如下:

var http = require("http");http.createServer(function(request, response) {response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();
}).listen(8888);

  nodejs使用模块化编程

    关于模块化,只要知道它解决什么问题即可:

      模块化其实就是封装,把一组特定功能的代码封装在一个类似java jar包的模块中,方便复用,使结构清晰,等等

      js从原生的顺序无模块代码,到自执行函数、jquery匿名函数、到CommonJS,就是一个模块化进程,习惯使用jquery的童鞋不应该抵触新的模块化编程

    nodejs的模块化,我们都要学习哪些?

      1.使用现成模块工具

        如上代码,copy到server.js中,cmd命令下执行   node server.js

        访问 http://localhost:8888/  ,一个简单的web服务就成功访问了!

        这里使用   require("http") 调用http模块,这个是nodejs内置的

      2.自己封装模块

        server.js可能我们会加入更多其他的路由代码,这时候我们可以把启动功能迁移出去,如何办?

        

var http = require("http");function start() {function onRequest(request, response) {console.log("Request received.");response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started.");
}exports.start = start;

        server.js修改一下,把启动web服务器的代码移到start方法体中,

      使用  exports.start = start  向外部暴露web启动方法

      习惯上,我们使用index.js来启动app,代码如下:

var server = require("./server");server.start();

      执行 node index.js  效果一样!

  3.完善web服务器的路由功能

    可以发现,访问8888的任意资源都会返回helloworld,why?

    这就说明我们这个服务器其实是缺少路由功能的,也可以说,路由功能使用基本的if else即可实现,我们先获取request请求路径

var http = require("http");
var url = require("url");function start() {function onRequest(request, response) {var pathname = url.parse(request.url).pathname;console.log("Request for " + pathname + " received.");response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started.");
}exports.start = start;

    使用url即可获取资源请求路径。

    习惯上,使用router.js来负责路由分发:

function route(pathname) {console.log("About to route a request for " + pathname);
}exports.route = route;

    server.js 导入route模块,  start方法调用route方法即可,

    当然,route其实应该作为服务器的一个组件传入进去,我们可以这样:

var http = require("http");
var url = require("url");function start(route) {function onRequest(request, response) {var pathname = url.parse(request.url).pathname;console.log("Request for " + pathname + " received.");route(pathname);response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started.");
}exports.start = start;

    而index.js相应的:

var server = require("./server");
var router = require("./router");server.start(router.route);

    事实上,我们现在的路由器还未有任何处理请求的功能,而根据经验,处理各种请求,应该有对应的程序块,

  如果在rout方法体中使用if else,那么代码结构将会极其丑陋

  js的函数式编程给了我们一个启示——可以将不同的请求封装在一个requestHandler中,然后暴露出来供route调用:

  requestHandlers.js

  

function start() {console.log("Request handler 'start' was called.");
}function upload() {console.log("Request handler 'upload' was called.");
}exports.start = start;
exports.upload = upload;

  index.js入口脚本来载入handler

var server = require("./server");
var router = require("./router");
var requestHandlers = require("./requestHandlers");var handle = {}
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;server.start(router.route, handle);

    handler就是一个字典,针对不同请求,执行不同的处理逻辑

    相应改变的,server.js

var http = require("http");
var url = require("url");function start(route, handle) {function onRequest(request, response) {var pathname = url.parse(request.url).pathname;console.log("Request for " + pathname + " received.");route(handle, pathname);response.writeHead(200, {"Content-Type": "text/plain"});response.write("Hello World");response.end();}http.createServer(onRequest).listen(8888);console.log("Server has started.");
}exports.start = start;

    router.js

function route(handle, pathname) {console.log("About to route a request for " + pathname);if (typeof handle[pathname] === 'function') {handle[pathname]();} else {console.log("No request handler found for " + pathname);}
}exports.route = route;

    至此,一个简单的路由功能就优雅的实现了!

    路由功能实现了,但是每个请求响应全都是hello world,这个处理起来也不复杂,只需要让handler返回结果,然后response将结果输出出去即可!



  

转载于:https://www.cnblogs.com/anybus/p/7723134.html

nodejs入门学习笔记一——一个完整的http路由服务实现相关推荐

  1. NodeJS入门——学习笔记

    之前有段时间闲着无聊,去B站上简单了解了一下NodeJS,下面是根据一个视频记录的笔记,供大家参考,错误之处请大家帮忙斧正.侵删. 目录 0 参考教程 1 NodeJs简介 1.1 官网介绍:http ...

  2. Crypto++入门学习笔记(DES、AES、RSA、SHA-256)

    Crypto++入门学习笔记(DES.AES.RSA.SHA-256) 背景(只是个人感想,技术上不对后面的内容构成知识性障碍,可以skip): 最近,基于某些原因和需要,笔者需要去了解一下Crypt ...

  3. 机器学习入门学习笔记:(3.2)ID3决策树程序实现

    前言 之前的博客中介绍了决策树算法的原理并进行了数学推导(机器学习入门学习笔记:(3.1)决策树算法).决策树的原理相对简单,决策树算法有:ID3,C4.5,CART等算法.接下来将对ID3决策树算法 ...

  4. Javascript入门学习笔记

    JS入门学习笔记目录 1.JS简介 2.组成部分 3.特点 4.作用 5.JS三种添加方式 6.变量 7.数据类型 8.检测数据类型 9.逗号运算符 10.算术运算符 11.关系运算符 12.逻辑运算 ...

  5. UE4入门学习笔记——纪念学习虚幻引擎满一周年

    UE4入门学习笔记 前言: 今天是正式学习ue4一周年.一年前的今天,我结束了PBR流程的学习,怀揣着对游戏制作的热爱,正式开始学习ue4,继续追寻儿时的那个大厂梦.谁也没想到,一年后的今天,我会在T ...

  6. python 批量下载知网(cnki)论文_Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记...

    ‍Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记‍ 由于需要也是为了督促自己学习新的东西,我原本想要尝试着写一个爬虫程序,能够在cnki上自动得将论文进行批量 ...

  7. python 批量下载知网(cnki)论文_Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记 顶...

    ‍Python 实现 CNKI批量下载 和FireFox Extension 入门学习笔记‍ 由于需要也是为了督促自己学习新的东西,我原本想要尝试着写一个爬虫程序,能够在cnki上自动得将论文进行批量 ...

  8. 原创 OpenCV3编程入门 学习笔记(总)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_36163358/article/ ...

  9. Crypto++入门学习笔记(DES、AES、RSA、SHA-256)(转)

    Crypto++入门学习笔记(DES.AES.RSA.SHA-256)(转) 2012-11-19 11:28:00|  分类: c++|举报|字号 订阅 背景(只是个人感想,技术上不对后面的内容构成 ...

最新文章

  1. ubuntu18.04安装python虚拟环境:virtualenv 【亲测有效】
  2. java使用链栈实现迷宫求解
  3. Using rqt_console and roslaunch
  4. AbstractListView源码分析5
  5. LinkedHashMap实现LRU缓存算法
  6. Hibernate深入之get()与load()懒加载
  7. 小别墅样式_6款三层小别墅样式,各风格特色图纸为农村自建量身打造
  8. 英特尔生产17个量子位超导芯片,现已交付合作伙伴
  9. IBM Copy Service--Flashcopy Introduction
  10. 推荐系统实例-基于矩阵分解
  11. 调用一个Activity并返回结果
  12. 要是面试官再问我synchronized,我就这么答
  13. Smart 200PLC PC Access SMART OPC通信
  14. 文献管理者ReferenceManager开发及使用
  15. Java线程中的静态方法_Java多线程3:Thread中的静态方法
  16. 如何删除Mysql注册列表残余文件
  17. 制造业MES生产管理系统程序代码 MES源码
  18. 计算机对逻辑算符的运算次序,逻辑运算符的优先顺序
  19. 从零到一保姆级Ubuntu深度学习服务器环境配置教程
  20. 分页第一页用0还是1_短视频拍摄技巧分享:教你如何从0到1学会用手机拍大片...

热门文章

  1. hibernate 各历史版本下载 spring各历史版本下载
  2. 题目1198:a+b
  3. 阅读《构建之法》 5-7章
  4. Wix 安装部署(五) Bootstrapper 捆绑安装
  5. 如何从课堂与教学内容两方面提高培训效率------张孝祥
  6. android studio第三方调试,Android Studio直接运行调试签名包
  7. 如何利用php下载文件_PHP使用文件流下载文件方法
  8. thinkphp mysql 密码加密_thinkphp微信开发(消息加密解密)
  9. spark基础之RDD和DataFrame和Dataset比较
  10. java 选中指定文件_Java如何打开一个文件夹并选中指定文件