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

创建一个router_1.js
var http = require('http')
var url = require('url')

http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})
if(req.url !== '/favicon.ico') {
var pathName = url.parse(req.url).pathname
console.log(pathName)
}
res.end()
}).listen(8000)

console.log('Server running at http://localhost:8000')


安装supervisor模块,可以不用每次启动js,使用命令supervisor route_1.js


创建一个modules/routers.js

module.exports = {
home: function(req, res) {
res.write('首页')
},
login: function(req, res) {
res.write('登录页面')
},
registor: function (req, res) {
res.write('注册页面')
}
}

修改router_1.js
var router = require('./modules/router')

var pathName = url.parse(req.url).pathname.replace(/\//, '')
console.log(pathName)
try {
router[pathName](req, res)
} catch(err) {
router['home'](req, res)
}
二、读取图片文件
将router_1.js另存为router_2.js
更改头部信息如下
res.writeHead(200,{"Content-Type":"image/jpeg"});
在modules/router.js中添加读取文件路由
img:function(req,res){
file.readImg('./images/pet.jpg', res)
}
创建modules/file.js
var fs = require('fs')
readImg: function (file, res) {
fs.readFile(file, 'binary', function (err, data) {
if (err) throw err
res.writeHead(200, {'Content-Type': 'image/jpeg'})
res.write(data, 'binary')
res.end()
})
}
此时可以删除router_2.js中的res.end()
在router.js中导入file.js
var file = require('./file')

此时发现如果在输出图片时没法正确显示
res.write('test');
res.write(data, 'binary')
三、路由改造
在file.js删除
res.write('test');
创建文件views/home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
首页
<!-- ./img为一个图片请求 -->
<img src="./img" alt="">
</body>
</html>
在file.js中创建一个模块readFile方法
readFile: function (file, res, req) {
fs.readFile(file, 'utf-8', function (err, data) {
if (err) throw err
res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'})
res.write(data)
res.end()
})
},
更改touter2_.js中的代码,保证是一个干净的路由请求
if(req.url !== '/favicon.ico') {
var pathName = url.parse(req.url).pathname.replace(/\//, '')
try {
router[pathName](req, res)
} catch(err) {
router['home'](req, res)
}
}
在router.js中的home路由中设置
home: function(req, res) {
file.readFile('./views/home.html', res, req)
},
四、参数接收

创建文件views/login.html
<form action="./login" method="get" >
<label for="email">
E-mail: <input type="text" name="email" value="" />
</label>
<label for="password">
密码:<input type="password" name="password" value="" />
</label>
<label for="submit">
<input type="submit" value="提交" />
</label>
</form>
更改路由router.js中的login方法
login:function(req,res){
var urlObject = url.parse(req.url,true).query;
console.log(urlObject.email)
console.log(urlObject.password)
file.readFile("./views/login.html",res,req);
}

post请求
修改files.js
引入querystring;
var queryString = require('querystring')
更改login方法
login: function(req, res) {
var post = ''
req.on('data', function(chunk){
post += chunk
})
req.on('end', function() {
var urlObject = queryString.parse(post);
console.log(urlObject.email)
console.log(urlObject.password)
file.readFile("./views/login.html",res,req);
})
},
更改views/login.html中请求的方法
action="./login" method="POST"

如果需要将提交的数据显示到页面
在file.js中添加一个方法
postReadFile: function (file, res, req, post) {
var urlObject = queryString.parse(post)
var array = ['email', 'password']
var reg;

fs.readFile(file, 'utf-8', function(err, data){
if(err) throw err
res.writeHead(200, {'Content_Type': 'text/html; charset=utf-8'})

for(var i = 0; i < array.length; i++) {
reg = new RegExp('{' + array[i] + '}', 'gi')
data = data.replace(reg, urlObject[array[i]])
}
res.write(data)
res.end()
})
},
更改router.js中的login方法
req.on('end', function() {
file.postReadFile('./views/login.html', res, req, post)
})
在login.html中添加显示信息
<div >
Email:{email}, 密码:{password}
</div>
如果第一次的时候我们发现显示不友好
可以设置一个样式
.hide{
display:none
}
在div中添加class="{infoClass}"
在form中设置class="{formClass}"
在file.js中postReadFile中添加处理email和password代码,放在for循环之后
if (urlObject.email && urlObject.password) {
data = data.replace(new RegExp('{infoClass}', 'gi'), '')
data = data.replace(new RegExp('{formClass}', 'gi'), 'hide')
} else {
data = data.replace(new RegExp('{infoClass}', 'gi'), 'hide')
data = data.replace(new RegExp('{formClass}', 'gi'), '')
}

nodejs中的路由的更多相关文章

  1. nodejs中常用加密算法

    在常用的nodejs+express工程中,为了安全在登录及表单传输时,应该都需进行加密传输,目前个人常用到的加密方式有下列几种: 1.Hash算法加密: 创建一个nodejs文件hash.js,输入 ...

  2. NodeJS中使用swig模板引擎

    NodeJS中的默认引擎是jade有点过于复杂,而且不是以HTML为基础的,学习成本和前端适应成本都很大.而ejs虽然简单,但不支持模板导入,而且效率一般. swig的语法简单,学习成本很低,符合常规 ...

  3. 在Nodejs中贯彻单元测试

    在团队合作中,你写好了一个函数,供队友使用,跑去跟你的队友说,你传个A值进去,他就会返回B结果了.过了一会,你队友跑过来说,我传个A值却返回C结果,怎么回事?你丫的有没有测试过啊? 大家一起写个项目, ...

  4. NodeJs中require use get typescript及其他知识点集合

    NodeJs的Express使用 nodejs事件的监听与事件的触发 TypeScript学习笔记 深入浅出Node.js Nodejs开发Office插件 类百度文库文档上传.转换和展示功能项目开源 ...

  5. NodeJS中常见异步接口定义(get、post、jsonp)

    越来越多的人在使用nodeJS,作为一门服务端语言,我们不可避免的要写异步接口(ajax和jsonp).再次强调ajax和jsonp是两个概念,但是由于jquery的封装,使这两种异步接口的调用方式, ...

  6. .NetCore MVC中的路由(2)在路由中使用约束

    p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...

  7. .NetCore MVC中的路由(1)路由配置基础

    .NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...

  8. nodejs中获取时间戳、时间差

    Nodejs中获取时间戳的方法有很多种,例如: new Date().getTime() Date.now() process.uptime() process.hrtime() 平时想获取一个时间戳 ...

  9. 在Nodejs中如何调用C#的代码

    最近需要在Nodejs中用到C#的代码,从网上了解到可以采用Edgejs来实现Nodejs与C#的代码交互, 直接复制网上的代码运行总是出各种错,填了不少坑,现在把自己的案例代码大致整理一下,方便以后 ...

随机推荐

  1. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  2. 用mfix模拟流化床时压力边界条件和迭代步长需要注意的问题

    没想到今天模拟一个冷态流化床都出现这么多问题.需要通入三种气体组成的混合物,这时入口边界的压力BC_P_g不能为零,否则会报错,但是,需要注意的是,收敛效果对这个压力边界非常敏感,我随意给了个30,结 ...

  3. RMAN中FILESPERSET设置对备份速度的影响

    看到网上部分人说不指定FILESPERSET(默认值=64)则会导致分配的通道只走第一个而导致备份效率低下,今天仔细研究了一下,参照了多个博主文章,得出结论如下: 如果没有指定filesperset, ...

  4. StackView的功能和用法

    StackView也是AdapterViewAnimator的子类,它也用于显示Adapter提供的系列View.SackView将会以“堆叠(Stack)”方式来显示多个列表项. 为了控制Stack ...

  5. Prolog 外部不能有 DOCTYPE 声明。处理资源 'http://192.168.115.152:8082/api/EmpApi.aspx' 时出错。第 3 行,位置: 11

    在Default.aspx代码中删除以下代码(其他窗口也是这样删除): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitiona ...

  6. NSException异常处理

    异常处理是管理非典型事件(例如未被识别的消息)的过程,此过程将会中断正常的程序执行.如果没有足够的错误处理,遇到非典型事件时,程序可能立刻抛出(或者引发)一种被称之为异常的东西,然后结束运行. 异常的 ...

  7. 【.net 深呼吸】细说CodeDom(10):生成异常处理语句

    写完这一篇,大概可以准备过年了,就算是这系列文章的收尾吧. 异常处理语句,就是常说的try...catch语句,有时候,也会带有finally子句.要生成异常处理语句,得用到CodeTryCatchF ...

  8. Treeview显示磁盘下的文件,并且可操作

    #region TreeView树形显示磁盘下文件夹 /// <summary> /// IconIndexs类 对应ImageList中5张图片的序列 /// </summary& ...

  9. .NET 通用高扩展性的细粒度权限管理架构(webApi/Mvc)

    一. 权限场景分析: 1. 系统具有角色概念, 部门概念, 且都具有相应不同的权限 2. 用户具有多个角色, 多个部门等关系, 并且能给单个用户指派独有的权限 3. 具有细粒度权限控制到资源的RBAC ...

  10. cygwin 运行窗口程序

    首先, 默认安装的cygwin是不能运行窗口程序的 比如,一段python窗口程序: import * from tkinter Tk() mainloop() 如果使用命令行: python3 py ...