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 相关文章推荐
JavaScript弹簧振子超简洁版 完全符合能量守恒,胡克定理
Oct 25 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
Dec 07 Javascript
js中settimeout方法加参数
Feb 28 Javascript
jQuery遍历Table应用示例
Apr 09 Javascript
JavaSacript中charCodeAt()方法的使用详解
Jun 05 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
Jan 28 Javascript
jQuery实现ToolTip元素定位显示功能示例
Nov 23 Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 Javascript
微信小程序中多个页面传参通信的学习与实践
May 05 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 Javascript
解决vue加scoped后就无法修改vant的UI组件的样式问题
Sep 07 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
js实现iframe动态调整高度的代码
2008/01/06 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
JavaScript中输出标签的方法
2014/08/27 Javascript
js实现交换运动效果的方法
2015/04/10 Javascript
JavaScript中的原型prototype属性使用详解
2015/06/05 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
BACKBONE.JS 简单入门范例
2017/10/17 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
2019/09/04 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
wxpython 学习笔记 第一天
2009/03/16 Python
Python字符串和文件操作常用函数分析
2015/04/08 Python
Python使用pickle模块储存对象操作示例
2018/08/15 Python
python机器学习之KNN分类算法
2018/08/29 Python
Python函数any()和all()的用法及区别介绍
2018/09/14 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
Python3.x+迅雷x 自动下载高分电影的实现方法
2020/01/12 Python
python实现手势识别的示例(入门)
2020/04/15 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
公司企业表扬信
2014/01/11 职场文书
十佳美德少年事迹材料
2014/02/05 职场文书
施工安全标语
2014/06/07 职场文书
企业文化标语大全
2014/06/10 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
爱护公物主题班会
2015/08/17 职场文书
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
2021/04/01 PHP
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python
win server2012 r2服务器共享文件夹如何设置
2022/06/21 Servers