nodeJS实战:自定义模块与引入,不同模块的函数传递及回调处理,exports与module.exports(基于nodejs6.2.0)
前言:本文基于上一篇文章中的源代码进行改写,地址:http://blog.csdn.net/eguid_1/article/details/52182386
注意:为什么不用module.exports,而使用exports?
module.exports的优先级比exports要高,为了防止自定义的模块与nodeJS原生模块冲突,所以这里采用exports定义模块名
文件名:root.js(node入口),parseRequest.js(自定义模块)
一、自定义nodejs模块
//文件名:parseRequest.js
//将自定义parseRequest模块映射到parseReq入口,调用时直接调parseRequest(s1, s2),而不是parseReq(s1,s2)
exports.parseRequest = parseReq;
//用于处理所有请求
function parseReq(s1, s2) {
var fs = s1;
var queryString = s2;
//解析REST请求
var restParse = function(response, pathName, queryStr) {
//解析请求参数
var reqStr = queryString.parse(queryStr);
switch (pathName) {
//简单实例,解析请求参数获取用户名并通过json数据返回
case "/dojoTest/getUser":
response.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' });
var str = "{'errNum': 200,'retMsg': '请求成功','data':' 用户名是:" + reqStr.user + "'}";
response.write(str);
break;
//简单实例:通过REST请求方式获取当前时间
case "/dojoTest/getTime":
response.writeHead(200, { 'Content-Type': 'application/json;charset=utf-8' });
response.write("{'errNum': 200,'retMsg': '请求成功','data':' 当前时间:" + new Date().toLocaleString() + "'}");
break;
//如果没有对应的REST请求,报个501错误给浏览器
default:
response.writeHead(501, { 'Content-Type': 'application/json;charset=utf-8' });
response.write('{"errNum": 501,"retMsg":"请求失败:该请求不存在","data":"null"}'); }
response.end();
};
//解析静态请求
var fileParse = function(response, pathName, suffixStr) {
//读取静态文件并生成流
fs.readFile(pathName.substr(1), function(err, data) {
if (err) {
console.log(err);
//HTTP 404 :页面不存在
//没找到对应的静态文件怎么办,给个404错误
response.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
//响应文件流
response.write("页面不存在!404");
response.end();
} else {
//HTTP 200 : 成功
if (suffixStr === ".css") {
//设置charset=utf-8防止乱码
response.writeHead(200, { 'Content-Type': 'text/css;charset=utf-8' });
} else {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
}
//响应文件流
response.write(data.toString());
response.end();
}
});
}
return {
parseRest: restParse,
parseFile: fileParse
}
};
二、引入nodejs模块
1、在nodejs启动文件中这样引入:
var rRequest = require('./parseRequest');
2、调用引入的模块
//加载自定义模块(./表示与本文件在同一级目录下,也可以写成./parseRequest.js,默认不需要写后缀)
var rRequest = require('./parseRequest');
//加载node模块
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var queryString = require('querystring');
//创建请求处理对象,用于处理静态文件及动态请求响应
var allReqParse = new rRequest.parseRequest(fs, queryString);
//创建服务器
http.createServer(function(request, response) {
//获取请求地址
var requrl = request.url;
var urlparse = url.parse(requrl);
//请求路径
var pathname = urlparse.pathname;
//pathname+参数
// var urlpath = urlparse.path;
//参数
var query = urlparse.query;
//同上,但参数前多个?
// var search = urlparse.search;
//后缀
var suffix = path.extname(pathname);
//控制台显示信息
// console.log("Request for " + pathname + " received,path is " + urlpath + ",query is" + query + ",search is" + search);
console.log("Request for " + pathname + "received,后缀是: " + suffix + ",参数: " + query);
if (suffix != null && suffix.trim() != "") {
rRequest.parseFile(response, pathname, suffix);
} else {
allReqParse.parseRest(response, pathname, query);
}
//响应结束
}).listen(8081);
//开启后在控制台显示该服务正在运行
console.log('Server running at http://127.0.0.1:8081/');
三、进一步深入模块化
看到上面的node入口是不是感觉代码太冗杂,那么现在我们实现创建server的模块化,让node入口彻底清爽
分三个文件:root.js,createServer.js(新创建,用于封装root.js中的服务器创建代码),parseRequest
三个文件的调用关系是root.js<----createServer.js<----parseRequest.js
注意:parseRequest.js中的代码保持不变
1、改写后的root.js
var server = require("./createServer");
//创建服务器
server.createServer(8081);
2、新建的createServer.js文件(直接复制了原有root.js代码,增加了一个端口变量)
//加载自定义模块(./表示与本文件在同一级目录下,也可以写成./parseRequest.js,默认不需要写后缀)
var rRequest = require('./parseRequest');
//加载node模块
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var queryString = require('querystring');
//创建请求处理对象,用于处理静态文件及动态请求响应
var allReqParse = new rRequest.parseRequest(fs, queryString); function start(port) {
var startServer = function(request, response) {
//获取请求地址
var requrl = request.url;
var urlparse = url.parse(requrl);
//请求路径
var pathname = urlparse.pathname;
//pathname+参数
// var urlpath = urlparse.path;
//参数
var query = urlparse.query;
//同上,但参数前多个?
// var search = urlparse.search;
//后缀
var suffix = path.extname(pathname);
//控制台显示信息
// console.log("Request for " + pathname + " received,path is " + urlpath + ",query is" + query + ",search is" + search);
console.log("Request for " + pathname + "received,后缀是: " + suffix + ",参数: " + query);
if (suffix != null && suffix.trim() != "") {
allReqParse.parseFile(response, pathname, suffix);
} else {
allReqParse.parseRest(response, pathname, query);
}
//响应结束
}
//创建服务器
http.createServer(startServer).listen(port); //注意这里的端口改成了变量
//开启后在控制台显示该服务正在运行
console.log('Server running at http://127.0.0.1:' + port + '/');
};
exports.createServer = start;
3、运行node,开启服务器成功
nodeJS实战:自定义模块与引入,不同模块的函数传递及回调处理,exports与module.exports(基于nodejs6.2.0)的更多相关文章
- nodejs模块中exports和module.exports的区别
通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ ,这些核心模块被编译成二进制文件,可以require('模块名')去获取:核心 ...
- nodeJS学习(9)--- nodeJS模块:exports vs module.exports
模块简介: 通过Node.js的官方API可以看到Node.js本身提供了很多核心模块 http://nodejs.org/api/ 这些核心模块被编译成二进制文件,可以 require('模块名') ...
- 理解node模块的exports和module.exports
exports是module.exports的引用,即var exports = module.exports.在一个模块的开头,这两个值都指向同一个空对象:exports = module.expo ...
- node.js模块中exports和module.exports的区别
Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...
- (译)Node.js的模块-exports和module.exports
原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...
- NodeJS的exports、module.exports与ES6的export、export default深入详解
前言 决定开始重新规范的学习一下node编程.但是引入模块我看到用 require的方式,再联想到咱们的ES6各种export .export default. 阿西吧,头都大了.... 头大完了,那 ...
- nodejs中exports与module.exports的区别详细介绍
如果模块是一个特定的类型就用Module.exports.如果模块是一个典型的"实例化对象"就用exports. exports.name = function() { conso ...
- 【nodejs】exports 和 module.exports 的区别
require 用来加载代码,而 exports 和 module.exports 则用来导出代码.但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 e ...
- nodejs中exports与module.exports的区别
转自--http://www.cnblogs.com/pigtail/archive/2013/01/14/2859555.html 你肯定非常熟悉nodejs模块中的exports对象,你可以用它创 ...
随机推荐
- js错误问题 The operation is insecure.
问题: 当我使用canvas的ctx.getImageData 方法时,js报错,错误是 The operation is insecure. 解决: 我使用ctx.getImageData获取can ...
- framework7+node+mongo项目
Famework7还是一个不错的前端框架 不过这个小项目做下来确实踩了不少的坑 废话不多说上干货 项目代码:https://github.com/tsxylhs/framework7
- websoket使用Protocol Buffers3.0传输
Protocol Buffers是Google推出的一个数据交换格式,相对于xml它的体积更小,更快,因为它是二进制传输的.3.0相对于2.0变动比较大.这些变动可以去看官方说明. 在前端使用Prot ...
- C专家编程阅读笔记
周末闲来无事,(哗),好久之前买的C专家编程一直没看,翻起来看了一下 尽量不使用unsigned 尽量不要在代码中使用unsigned,尤其是一些看起来是无符号类型的数字,比如年龄等,因为难免要使用u ...
- 分布式锁与实现(二)——基于ZooKeeper实现
引言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...
- hdu2389二分图之Hopcroft Karp算法
You're giving a party in the garden of your villa by the sea. The party is a huge success, and every ...
- shell入门笔记1:执行方式、运行方式、变量、替换
说明: 本文是关于http://c.biancheng.net/cpp/shell/的相关笔记 shell的两种执行方式 交互式(interactive) 解释执行用户的命令,用户输入一条命令,She ...
- 【源码学习】之requirejs
对于现在的前端生态来说,requirejs是有点过时了,webpack帮我们包干了一切.但是对于学习源码这件事情来说,永远是不过时的! 最近稍微闲下来了一点,就着以前做过的项目,我也来看看requir ...
- 在已经部署svn 服务器上,搭建svn项目 成功版
1.进入svn目录,建立版本库 svnadmin create svntest svntest为svn项目名称 2. hooks/ 目录下新建 post-commit 文件 [钩子脚本] #!/bin ...
- Java 多线程详解(一)------概念的引入
这是讲解 Java 多线程的第一章,我们在进入讲解之前,需要对以下几个概念有所了解. 1.并发和并行 并行:指两个或多个时间在同一时刻发生(同时发生): 并发:指两个或多个事件在一个时间段内发生. 在 ...