node.js 针对不同的请求路径(url) 做出不同的响应
上篇文章讲到了浏览器中访问 http://127.0.0.1:8888/ 输出 "hello world", 但是实际当中, 用户访问的或许是 http://127.0.0.1:8888/start 异或者 http://127.0.0.1:8888/upload , 那么node.js该如何去针对不同的请求路径(url) 做出不同的响应呢。
要做的事
1.构建一个路由模块
模块作用:提供请求的URL和其他需要的GET及POST参数,随后根据这些数据来执行相应的代码。因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。
2.构建一个处理请求的程序模块
模块作用:存放不同的处理程序,和请求的URL相对应
3.将前面两个模块和http服务器结合起来
一、构建一个 路由 模块
新建一个 router.js 写入
// 路由模块,针对不同的请求,做出不同的响应
// handle 处理请求方法 function route(handle, pathname) {
console.log("About to route a request for " + pathname); // 检查给定的路径对应的请求处理程序是否存在,如果存在的话直接调用相应的函数
if (typeof handle[pathname] == "function") {
handle[pathname]();
} else {
console.log("No request handler found for " + pathname);
}
} exports.route = route;
二、构建一个处理请求的程序模块
新建一个 requestHandlers.js 写入
// 存放不同的处理程序,和请求的URL相对应
function start() {
console.log("Request handler 'start' was called.");
} function upload() {
console.log("Request handler 'upload' was called.");
} exports.start = start;
exports.upload = upload;
三、将前面两个模块和http服务器结合起来
路由模块的作用是:提供请求的URL和其他需要的GET及POST参数,随后根据这些数据来执行相应的代码。因此,我们需要查看HTTP请求,从中提取出请求的URL以及GET/POST参数。
我们需要的所有数据都会包含在request对象中,该对象作为onRequest()回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的Node.JS模块,它们分别是url和querystring模块。
在server.js里面分别引入
url模块:解析url
querystring模块: 解析GET和 POST请求带的参数 (后面再说)
修改 server.js
// 请求(require)一个 nodejs 自带的 http模块
// 请求(require)一个 nodejs 自带的 url解析模块
var http = require("http"),
url = require("url"); // console.log(url); // 调用 http模块 提供的 createServer函数:
// 返回一个对象,这个对象有一个 listen 方法,这个方法带一个数值参数,
// 指定这个 http 服务器监听的端口号. function start(route, handle) { function onRequest(request, response) {
// 获取请求路径
var pathname = url.parse(request.url).pathname; // 关闭nodejs 默认访问 favicon.ico
if (!pathname.indexOf('/favicon.ico')) {
return;
}; // 收到来自 pathname 的请求
console.log("Request for " + pathname + " received."); // 路由器处理
route(handle, pathname); // 返回数据
response.writeHead(200, {"Content-type": "text/plain"});
response.write("Hello world!");
response.end();
} http.createServer(onRequest).listen(8888);
console.log("Server has start!");
} // 开放接口
exports.start = start;
修改 index.js
var server = require("./server"),
router = require("./router"),
requestHandlers = require("./requestHandlers");
// handle 保存不同请求路径对应的处理方法
var handle = {};
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
// 传入路由模块方法, 路径处理方法
server.start(router.route, handle);
四、测试
在 command 面板输入 node index.js
浏览器访问 http://127.0.0.1:8888/start command 面板显示

整个过程中有个插曲,就是我测试的时候 command面板 每次都会输出一次 访问 /favicon.ico 的记录,然后百度得到了屏蔽的方法
http://cnodejs.org/topic/529be564a6957a0809408cab
在 server.js 中插入
// 关闭nodejs 默认访问 favicon.ico
if (!pathname.indexOf('/favicon.ico')) {
return;
};
node.js 针对不同的请求路径(url) 做出不同的响应的更多相关文章
- Node.js:GET/POST请求
ylbtech-Node.js:GET/POST请求 1.返回顶部 1. Node.js GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交. 表单提交到服务器一般 ...
- node.js GET与POST请求
node.js GET与POST请求 转 http://www.voidcn.com/article/p-ncglaiqx-bdx.html 标签 get post node.js 栏目 Node.j ...
- Node.js模拟发起http请求从异步转同步的5种方法
使用Node.js模拟发起http请求很常用的,但是由于Node模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便.下面总结了几个常见的库API从异步转同步的几种 ...
- Node.js:get/post请求、全局对象、工具模块
一.GET/POST请求 在很多场景中,我们的服务器都需要跟用户的浏览器打交道,如表单提交.表单提交到服务器一般都使用 GET/POST 请求. 1.获取GET请求内容 由于GET请求直接被嵌入在路径 ...
- node.js当中的http模块与url模块的简单介绍
一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务 ...
- Node.js 使用 soap 模块请求 WebService 服务接口
项目开发中需要请求webservice服务,前端主要使用node.js 作为运行环境,因此可以使用soap进行请求. 使用SOAP请求webservice服务的流程如下: 1.进入项目目录,安装 so ...
- 【node.js】GET/POST请求、Web 模块
获取GET请求内容 node.js 中 url 模块中的 parse 函数提供了这个功能. var http = require('http'); var url = require('url'); ...
- Node.js~ioredis处理耗时请求时连接数瀑增
回到目录 关于redis连接数过高的解释 对于node.js开发环境里,使用传统的redis或者使用ioredis都是不错的选择,而在处理大数据请求程中,偶尔出现了连接池( redis服务端的最大可用 ...
- Node.js学习笔记(3)--url.parse方法
说明(2017-5-2 14:23:47): 1. index.html <!DOCTYPE html> <html lang="en"> <head ...
随机推荐
- Linux SocketCan client server demo hacking
/*********************************************************************** * Linux SocketCan client se ...
- DB2创建序列
一.创建序列 序列是按照一定的规则生产的数值,序列的作用非常的大,比如银行交易中的流水号,就是记录每笔交易的关键字段. 通过create sequence语句创建序列,具体语法如下: >> ...
- 设计模式:Observer(观察者)—— Guava EventBus
本文分为三个部分: Observer(观察者) Guava EventBus详解 Guava EventBus使用示例 1. Observer(观察者) 1.1 背景 我们设计系统时, ...
- 使用SignalR 提高B2C商城用户体验1
vs2010 使用SignalR 提高B2C商城用户体验(一) 1.需求简介,做为新时代的b2c商城,没有即时通讯,怎么提供用户粘稠度,怎么增加销量,用户购物的第一习惯就是咨询,即时通讯,应运而生.这 ...
- Parallel for-each loops in .NET C# z
An IEnumerable object An Action of T which is used to process each item in the list List<string&g ...
- HDU 3533 Escape BFS搜索
题意:懒得说了 分析:开个no[100][100][1000]的bool类型的数组就行了,没啥可说的 #include <iostream> #include <cstdio> ...
- Msp430概述
总结一下MSP430给我的印象吧,感觉他就是一个迷你型的arm 1:MSP430采用的是精简指令,他只有27条核心的汇编指令,这一点和arm相同,arm同样是采用精简指令,而80c51采用的是冗余指令 ...
- MFC定时器使用
MFC定时器实现方法 方法一:CWnd类提供的成员函数SetTimer实现定时器功能,只能在CWnd类或其派生类中调用. 方法二:Windows API函数SetTimer来实现. MFC定时器 启动 ...
- 三相异步电动机过载保护及报警PLC控制
一.项目所需设备.工具.材料 见表7-1. 表7-1 项目所需设备.工具.材料 二. 训练内容: 1.项目描述 试设计一电动机过载保护程序,要求电动机过载时能自动停止运转,同时发出10秒钟的声光报 ...
- C# 发送邮件整理,包括控制台程序、WPF、WebForm 及 ASP.NET MVC
一直想把发送邮件的功能掌握,总是各种情况拖着了,这两天终于看了一下,整理一下,希望能帮到想学的. 发送邮件使用SMTP服务器,有两种方案,一种是使用IIS的SMTP功能:另一种是直接使用邮件供应商的S ...