Node.js学习笔记(十一、路由)

举报
三分恶 发表于 2021/04/24 00:28:15 2021/04/24
【摘要】 Node.js 路由 路由是干什么的? 路由是通过设置路径访问相应的函数。 为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码。 需要的数据从http请求中来,包含在request对象中,为了解析这些数据,需要额外的Node.JS模块,它们分别是url和querystring模块。 url.parse(string).q...

Node.js 路由

路由是干什么的?
路由是通过设置路径访问相应的函数。
为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据来执行相应的代码。
需要的数据从http请求中来,包含在request对象中,为了解析这些数据,需要额外的Node.JS模块,它们分别是url和querystring模块。

url.parse(string).query | url.parse(string).pathname | | | | | ------ -------------------
http://localhost:8888/listCategory --- ----- | | | | querystring(string)["foo"] | | querystring(string)["hello"]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

对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; //获取路径 var html = route(handle, pathname); response.writeHead(200, {"Content-Type": "text/plain"}); response.write(html); response.end(); } http.createServer(onRequest).listen(8888); console.log("Server has started.");
} exports.start = start; 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

路由router.js

function route(handle, pathname) { if (typeof handle[pathname] === 'function') { return handle[pathname](); } else { return pathname + ' is not defined';
  } 
} 
exports.route = route; 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

业务处理模块 requestHandlers.js

提供两个函数,返回不同的字符串。

//业务处理模块
function listCategory() { return "a lot of categorys";
} function listProduct() { return "a lot of products";
} exports.listCategory = listCategory; 
exports.listProduct = listProduct; 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

入口主模块 index.js

与以往启动使用 server.js不同,带路由功能,一般都会通过 index.js 启动,所以index.js 就是入口模块。
handle 是一个数组,映射了不同的访问路径与 业务处理模块对应函数的一一对应关系。

handle["/listCategory"] = requestHandlers.listCategory;  

  
 
  • 1

这就表示访问路径 /listCategory的话,就会交给函数 requestHandlers.listCategory 来处理。

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

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

启动访问

通过访问入口主模块:

node index.js

  
 
  • 1

在这里插入图片描述
访问:
在这里插入图片描述
在这里插入图片描述

过程

1、启动index.js
2、index.js 调用了 server.start 函数,并且传递了 router.js 里route 函数和handle数组作为参数
3. serverl.js 通过了8888端口启动了服务。 然后用 onRequest 函数来处理业务
3.1 在 onRequest 中,首先获取 访问路径 pathname
3.2 然后调用 router.js 的route 函数,并把pathname 和 handle数组传递进去
4. 在router.js 中,通过pathname为下标获调用真正的业务函数,并把业务函数的返回值返回出去。
4.1 如果找不到,比如访问 /listUser 这个路径就没有在 handle 数组中找到对应,那么就会返回 listUser is not defined.
5. 当访问地址是 /listCategory的时候, 真正的业务函数 requestHandlers.js 中的 listCategory() 就会被调用,并返回业务 Html 代码 : “a lots of categorys”。
比最初的访问要复杂一些,但是便于拓展功能模块。如果开发了新的模块,只需要在index.js中添加相应映射就行了。


参考:

【1】、http://how2j.cn/k/nodejs/nodejs-router/1763.html
【2】、https://www.runoob.com/nodejs/nodejs-router.html
【3】、https://www.w3cschool.cn/nodejs/nodejs-router.html

文章来源: blog.csdn.net,作者:三分恶,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/sinat_40770656/article/details/96761383

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。