Node.js 路由的实现方法


Posted in Javascript onJune 05, 2019

我们平时工作中,涉及到后台开发,路由基本上是我们第一个需要建的,路由还是很重要的。

那么,什么是路由呢,通俗点举个例子,一个宾馆前台,来了十位客人,前台会安排十位客人入住,每位客人到达宾馆以后,该去哪个房间,都是通过前台来安排。(别喷我)

在一个域名下,会有很多个可访问的地址,这就是路由。

我们呢,要为路由提供请求的URL和其他需要的GET及POST参数,随后路由需要根据这些数据,来决定执行哪些代码。/
因此,我们要查看HTTP请求,从中提取出来我们需要的URL以及GET/POST参数。
我们需要的这些数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的Node.js模块,它们分别是url和querystring模块。

url.parse(string).query
                      |
      url.parse(string).pathname   |
            |          |
            |          |
           ------ -------------------
http://localhost:8888/start?foo=bar&hello=world
                ---    -----
                 |     |
                 |     |
       querystring.parse(queryString)["foo"]  |
                      |
             querystring.parse(queryString)["hello"]

也可以用querystring模块来解析post请求体中的参数,下面会有代码演示。

现在我们写一段代码,用来找出浏览器请求的URL路径 之前也写到如何用node起serve

我们新建一个server.js 代码如下

// 代码route()方法为第二个创建的router.js那的方法。我们在这里使用
const http = require('http')
const url = require('url')

function start(route){
  function onRequest(request, response) {
    let pathName = url.parse(request.url).pathname // 通过url获取到当前访问路径
    console.log('Request for ' + pathName + 'received.')
    route(pathName,response)
  }
  http.createServer(onRequest).listen(8888)
  console.log('Server has started')
}
exports.start = start

然后创建router.js

// 通过传递过来到pathname,来进行不同的操作,如果是根目录,打印hello world
// 如果是/index 打印 pathname :/index
// 如果是其他 打印404
function route(pathname,response) {
  console.log('About to route a request for ' + pathname)
  response.writeHead(200, {'Content-Type' : 'text/plain'})
  if(pathname == '/') {
    response.write('Hello World')
    response.end()
  }else if(pathname == '/index'){
    response.write('pathname :/index')
    response.end()
  } else {
    response.write('404')
    response.end()
  }
  
}
exports.route = route

真实环境肯定不会这么写,这样写主要是理解路由的工作原理

接下来我们创建index.js 倒入我们写好的两个模块。

const server = require('./server')
const router = require('./router')

server.start(router.route)

调用server下的start方法,把router那的route方法传入进去。整体的逻辑就出来了,通过server.js 创建http服务,通过node内置模块url获取到当前访问路径,在通过router.js 对不同访问路径进行不同对代码操作。

最终我们启动命令行 输入node index.js 随后请求一个url 我们就会看到应用输出相应对信息,这表明我们对HTTP服务器已经在使用路由模块了。并会将请求对路径传递给路由,再由路由进行接下来对操作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现GridView单选效果自动设置交替行、选中行、鼠标移动行背景色
May 27 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
Javascript节点关系实例分析
May 15 Javascript
12种JavaScript常用的MVC框架比较分析
Nov 16 Javascript
浅谈JavaScript 覆盖原型以及更改原型
Aug 31 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
Dec 29 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
Feb 09 Javascript
基于Vue实例对象的数据选项
Aug 09 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 jQuery
Node.js学习之内置模块fs用法示例
Jan 22 Javascript
微信小程序实现打卡签到页面
Sep 21 Javascript
nestjs返回给前端数据格式的封装实现
Feb 22 Javascript
JS实现动态添加外部js、css到head标签的方法
Jun 05 #Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
Jun 05 #Javascript
jQuery操作cookie的示例代码
Jun 05 #jQuery
JS实现从对象获取对象中单个键值的方法示例
Jun 05 #Javascript
微信小程序如何实现全局重新加载
Jun 05 #Javascript
JS数组Object.keys()方法的使用示例
Jun 05 #Javascript
express + jwt + postMan验证实现持久化登录
Jun 05 #Javascript
You might like
PHP中Laravel 关联查询返回错误id的解决方法
2017/04/01 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
Div自动滚动到末尾的代码
2008/10/26 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
浅谈bootstrap源码分析之tab(选项卡)
2016/06/06 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
jQuery EasyUI 为Combo,Combobox添加清除值功能的实例
2017/04/13 jQuery
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
关于微信公众号开发无法支付的问题解决
2018/12/28 Javascript
JavaScript使用闭包模仿块级作用域操作示例
2019/01/21 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
详解Vue3 Composition API中的提取和重用逻辑
2020/04/29 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
使用Python实现下载网易云音乐的高清MV
2015/03/16 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
Python开发.exe小工具的详细步骤
2021/01/27 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
网络工程师的自我评价
2013/10/02 职场文书
优秀小学生家长评语
2014/01/30 职场文书
名人演讲稿范文
2014/09/16 职场文书
员工工作及收入证明
2014/10/28 职场文书
2014年终工作总结范本
2014/12/15 职场文书
优秀大学生自荐信
2015/03/26 职场文书
安全生产感想
2015/08/07 职场文书
医德医风学习心得体会
2016/01/25 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis