Node.JS中http路由服务实现是怎样,要点有哪些

Admin 2022-08-18 群英技术资讯 379 次浏览

今天小编跟大家讲解下有关“Node.JS中http路由服务实现是怎样,要点有哪些”的内容 ,相信小伙伴们对这个话题应该有所关注吧,小编也收集到了相关资料,希望小伙伴们看了有所帮助。

  开始学习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将结果输出出去即可!


“Node.JS中http路由服务实现是怎样,要点有哪些”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业技术相关的知识可以关注群英网络网站,小编每天都会为大家更新不同的知识。 群英智防CDN,智能加速解决方案

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

猜你喜欢

成为群英会员,开启智能安全云计算之旅

立即注册
专业资深工程师驻守
7X24小时快速响应
一站式无忧技术支持
免费备案服务
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
在线客服
微信公众号
返回顶部
返回顶部 返回顶部
在线客服
在线客服