nodejs进阶(3)—路由处理

news2024/10/5 16:26:00

1. url.parse(url)解析

该方法将一个URL字符串转换成对象并返回。

url.parse(urlStr, [parseQueryString], [slashesDenoteHost])

接收参数:

urlStr                                       url字符串

parseQueryString                   为true时将使用查询模块分析查询字符串,默认为false

我们通过解析HTTP请求,从中提取出请求的URL以及GET/POST参数。url是nodejs内置的一个模板,我们需要require("url")获取,下面的url:http://localhost:8888/start?foo=bar&hello=world,通过url.parse解析出的一个对象的各个字段名对应url的各部分。

var url = require('url');
var queryUrl = "http://localhost:8888/start?foo=bar&hello=world" ;
console.log(typeof url.parse(queryUrl)) ;
console.log(url.parse(queryUrl)) ;
//输出结果如下:
/* object // typeof
{
    protocol: 'http:',
    slashes: true,
    auth: null,
    host: 'localhost:8888',
    port: '8888',
    hostname: 'localhost',
    hash: null,
    search: '?foo=bar&hello=world',
    query: 'foo=bar&hello=world',
    pathname: '/start',
    path: '/start?foo=bar&hello=world',
    href: 'http://localhost:8888/start?foo=bar&hello=world'
}
 
加以说明如下:  
  protocol: 请求协议
  host: URL主机名已全部转换成小写, 包括端口信息
  auth:URL中身份验证信息部分
  hostname:主机的主机名部分, 已转换成小写
  port: 主机的端口号部分
  pathname: URL的路径部分,位于主机名之后请求查询之前
  search: URL 的“查询字符串”部分,包括开头的问号。
  path: pathname 和 search 连在一起。
  query: 查询字符串中的参数部分(问号后面部分字符串),或者使用 querystring.parse() 解析后返回的对象。
  hash: URL 的 “#” 后面部分(包括 # 符号) */

用下面的图更形象的描述说明给大家:

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

2. 路由选择实现代码

处理不同的HTTP请求在我们的代码中是另外一个不同的部分,叫做“路由选择”。

那么,我们接下来就创造一个叫做 路由 的模块吧。

新建属于服务器端的路由文件router.js

 //-----------------router.js--------------------------------
 module.exports={
     login:function(req,res){
         res.write("我是login方法");
     },
     register:function(req,res){
         res.write("我是注册方法");
     }
 } 

服务端调用路由,方式和上一节课《nodejs进阶2--函数模块调用》中最后提到的字符串调用函数一样。

 //---------4_router.js-----------
 var http = require('http');
 var url = require('url');
 var router = require('./router');
 http.createServer(function    (request,    response)    {
         response.writeHead(200,    {'Content-Type': 'text/html; charset=utf-8'});
         if(request.url!=="/favicon.ico"){
                 var pathname = url.parse(request.url).pathname;//得到请求的路径
                 console.log(pathname);
                 pathname = pathname.replace(/\//, '');//替换掉前面的/
                 console.log(pathname);
                 router[pathname](request,response);
                 response.end('');
         }
 }).listen(8000);
 console.log('Server running at http://127.0.0.1:8000/');    

上面我们用到了node自带模块url。url.path(urlStr):将一个URL字符串转换成对象并返回。

3. 向页面输出html文件

对于一般的get请求,例如localhost/login 我们需要给浏览器输出个页面login.html,那我们怎么做呢?

首先我们新增两个页面

1.login.html

 <html>
 <head>
 </head>
 <body>
 登录:
 <p>这是一个段落</p>
 <h1>样式1</h1>
 </body>
 <html>

2.register.html

 <html>
 <head>
 </head>
 <body>
 注册:
 <p>这是一个段落</p>
 <h1>样式1</h1>
 </body>
 <html>

读取文件的方法,我们放到文件models/file.js里

 //-------------models/file.js-------------------------
 var  fs=  require('fs');
 module.exports={
     readfile:function(path,callback){          //异步读文件,需要传入回调函数
         fs.readFile(path,  function  (err,  data)  {
             if  (err)  {
                 console.log(err);
             }else{
                 callback(data);
             }
         });
         console.log("异步方法执行完毕");
     },
     readfileSync:function(path){      //同步读取
         var  data  =  fs.readFileSync(path,'utf-8');
         console.log("同步方法执行完毕");
         return  data;                
     }
 }

router.js需要调用文件读取方法,把两个页面html文件读取出内容并输出到response。需要注意的是:res.end()这句话的位置,如果用异步读文件的方法就不能放到server创建那块了

 //-----------------router.js--------------------------------
 var file = require('./models/file');
 module.exports={
     login:function(req,res){
         var callback=function(data){
             res.write(data);
             res.end();
         }
         file.readfile('./views/login.html',callback);//使用异步读取
     },
     register:function(req,res){
         var data=file.readfileSync('./views/register.html');//使用同步读取
         res.write(data);
         res.end();
     }
 } 

我们重新运行:node 4_router.js。分别在浏览器输入http://localhost:8000/login 和http://localhost:8000/register  ,输出了login.html和register.html页面的内容。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Vue框架的思源新闻发布平台设计与实现(论文+源码)_kaic

摘 要 经过针对全校随机抽取的100名学生进行的研究发现&#xff0c;有约69&#xff05;的学生&#xff0c;并不关心思源新闻&#xff0c;一些学生表示思源每天发生的大小事与他们无关。这项调查突显了需要提供一个能激发学生对思源校园新闻感兴趣的平台。因此本文为思源学院全…

今天面了个字节拿38K出来的,真是砂纸擦屁股,给我露一手

今年的春招已经结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石…

H264宏块包含的各种语法信息详解

H264宏块包含的各种语法信息详解 本文将以CABAC编码需要编码的语法元素的程序为例&#xff0c;分析H264宏块中所包含的各种语法元素的含义。 以上三种变量的其他情况分支&#xff0c;本文进行了省略处理&#xff0c;完整的&#xff0c;全分支的CABAC编码见参考资料【1】 1、 s…

vscode使用插件remote-ssh远程连接服务器

vscode使用插件remote-ssh远程连接服务器 0.引言1.配置密钥对1.1.本地端1.2.服务器端 2.服务器端配置3.vscode连接4.调试 0.引言 用上了公司百万级的服务器 &#x1f606; &#x1f606; &#x1f606; &#x1f606; 参考1参考2 1.配置密钥对 生成密钥对&#xff0c;是为了…

[离散数学]谓词逻辑与推理演算

文章目录 谓词逻辑辖域变元的约束---换自由变元 不容易出错枚举前束范式量词例子练习题特殊例子如果明天下雨&#xff0c;则某些人将被淋湿如果人都爱美,则漂亮的衣服有销路 谓词推理量词相关规则 (去量词 加量词) 谓词逻辑 辖域 变元的约束—换自由变元 不容易出错 枚举 前束范…

博客系统后端设计(五) - 实现登录页面功能

文章目录 约定前后端交互接口修改前段代码修改后端代码登录测试 约定前后端交互接口 这里约定请求是一个 POST 请求&#xff0c;路径是 /login&#xff0c;使用的是以下的格式&#xff1a; usernamzhangsan&password123 响应是 HTTP/1.1 302&#xff0c;因为在成功登录之…

SpringCloud(26.分布式服务框架Dubbo面试题简析)

上一篇&#xff1a;25. 简述 Seata 的原理 下一篇&#xff1a;27. Redis 和 ZK 分布式锁 文章目录 1. 为什么要将系统进行拆分&#xff1f;2. 如何进行系统拆分&#xff1f;3. 拆分后不用 dubbo 可以吗&#xff1f;4. dubbo 工作原理5. 注册中心挂了可以继续通信吗&#xff1…

【Drone】ubuntu 20.x 版本下 通过docker-compose方式部署drone的全流程 整合gitee

一、前期准备 1、ubuntu环境 确定是否具有 ssh&#xff1a; service ssh start&#xff0c;如果没有&#xff0c;使用&#xff1a;apt install openssh-server 进行安装查看 Linux 的 IP 地址&#xff1a; ifconfig&#xff0c;命令不可用时&#xff0c;通过&#xff1a;apt …

pdf太大,怎么压缩的小一点,这几个方法高效便捷

pdf太大&#xff0c;怎么压缩的小一点呢&#xff1f;我们在日常办公中&#xff0c;使用到pdf文件的情况很多。因为pdf文件可以在几乎所有操作系统和设备上打开&#xff0c;这使得它们非常方便。而且PDF 文件的内容和格式在不同设备之间始终保持一致&#xff0c;这意味着无论在哪…

PowerShell install 一键部署virtualbox

VirtualBox 前言 VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c;使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。Innotek 以 GNU General Public Licens…

优思学院|什么是8D报告?

企业中的问题&#xff0c;就像生活中的麻烦事&#xff0c;总是层出不穷&#xff0c;让人头疼不已。有时候&#xff0c;我们可能会遇到一些棘手的问题&#xff0c;简单的方法已经无法解决了&#xff0c;这时候&#xff0c;8D问题解决法就是一把利器。 所以&#xff0c;我们不应…

档案室库房十防要求及措施

档案室“十防”措施 根据档案保护技术的要求&#xff0c;结合本公司档案实际&#xff0c;现制定“十防”措施如下&#xff1a; 一、 防火 1、 指定专人负责防火安全工作。 2、 定期检查手动灭火器&#xff0c;发现灭火器表压低于绿色区域时&#xff0c;必须及重新充装。 3、…

Consule系列:Consul实现详解

Consul 的实现 Consul 使用 Consensus 协议提供一致性(Consistency)—— CAP 定义的一致性。Consensus 协议是基于 “Raft: In search of an Understandable Consensus Algorithm” 实现的。 Consul Protocol Raft 算法 Raft 是基于 Paxos 的一致性算法。 与 Paxos 相比&#x…

Java每日一练(20230518) 移除元素、跳跃游戏II、复原IP地址

目录 1. 移除链表元素 &#x1f31f; 2. 跳跃游戏 II &#x1f31f;&#x1f31f; 3. 复原 IP 地址 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 移…

在 Mac M2 (arm64架构)上编译安装 GmSSL 工具

GmSSL是一个开源密码工具包&#xff0c;为GM/T系列标准中规定的中国国家密码算法和协议提供一级支持。作为OpenSSL项目的一个分支&#xff0c;GmSSL提供了与OpenSSL的API级兼容性&#xff0c;并维护了所有功能。现有的项目&#xff0c;如ApacheWeb服务器&#xff0c;只需稍加修…

前端面试题整理3

目录 1.不使用promise怎么实现一个异步编程? 2.this的指向有哪些&#xff1f; 3.Ref和reactive响应式的区别&#xff1f; 4.首屏加载优化。如何处理&#xff1f; 5.axios封装&#xff1f; 6.css为什么使用预处理&#xff1f; 7.从1000-9999里面取出AAAA这种数字&#xf…

从价格战中突围,仅10个月开发出一款车,安全性能靠谱吗?

经历了2023年初的价格战&#xff0c;一场关于智能汽车的淘汰赛似乎正式开始了。 尽管“降价热潮”还在继续&#xff0c;但简单的价格竞争毕竟非长久良策。 一方面&#xff0c;为了维持收益&#xff0c;部分车企通过减配、降低服务成本&#xff0c;甚至将降本压力给到上游供应…

【这个命令的 7 种用法!你确定不会用?】

可以很肯定地说&#xff0c;find 命令是 Linux 后台开发人员必须熟知的操作之一&#xff0c;除非您使用的是 Windows Server。 对于技术面试&#xff0c;它也是一个热门话题。让我们看一道真题&#xff1a; 如果你的 Linux 服务器上有一个名为 logs 的目录&#xff0c;如何删…

Spring 事务和事务传播机制

1.什么是事务&#xff08;为什么要有事务&#xff09; 事务就是将一组操作封装成一个执行单元&#xff08;封装到一起&#xff09;&#xff0c;要么一起成功&#xff0c;要么一起失败。 在打账的情景上&#xff0c;A向B转账200 元&#xff0c;A的账户-200.B的账号200&#xff…

基于直流微电网的光伏并网功率转换装置设计与运行仿真

摘要 微电网是目前国内外应用较为广泛的一种绿色可再生能源&#xff0c;近几年我国微电网产业的发展十分迅速。然后&#xff0c;越来越多的微电网系统建立并网&#xff0c;微电网产生的电能受外界因素影响较大&#xff0c;具有一定的随机性和波动性&#xff0c;给并网后的电力系…