用Node.js 写Web框架(4)

不得不说,基本上我们还没到写框架的日子,前面这些,完全都是在写一个web服务器(而且还没写完)。

今天的工作主要是整理。

首先来谈谈Node.js中模块的概念。基本上我们以前的工作就是:写一个js文件,然后根据相对路径来引用它。这里出现一个问题,就是相对路径实际上并不稳定,而且我们后期可能把所有框架级别的内容单独放置在一个文件夹中,这时候同样会改变相对路径,所以需要引入模块来实现require时候的稳定。

Node.js中从路径Y中require(X)的流程为:

1. 如果X是核心模块(如http、fs等),返回核心模块
2. 如果X以'./'或者'../'或者'/'开始,首先尝试以文件方式加载,失败则尝试以文件夹方式加载
3. 如果2失败,则尝试在node_modules目录下查找该模块

更详细内容可以看这个:

这里我们使用第三种,就是把所有框架级别的文件单独放在node_modules下的一个文件夹下,并根据来重新整理文件夹结构。

首先是文件夹结构:
顶层文件夹中,包含一个文件:package.json,用于描述包信息
二进制文件放在/bin下
Javascript文件放在/lib下
文档放在/doc下
测试文件放在/test下

原文:

整理以后,简单的写一下package.json

{
 "name" : "restjs",
 "main" : "./lib/main.js",
 "maintainers" : [
  {
   "name" : "Jeky Cui",
   "email" : "Jeky.Cui@gmail.com"
  }
 ]
}

好,模块文件整理部分到此结束。

下面开始分离框架部分。这里遇到的问题依然是路径,实在没办法了,只好使用fs.realpath来解决:

module.exports = {
 staticPath : 'static',
 maxAge : 1000 * 60 * 60 * 24 * 7,
 welcomeFile : 'index.html',
 devMode : true,
 modulePath : 'modules',
 indexName : 'index',
 viewFilename : 'views.js'
}

好,到此为止,完全分离了服务器&框架部分和业务逻辑部分。实际上到目前为止,已经写完了一个基本可用的静态服务器。

下面开始做动态部分。主要内容有:
1. 请求的封装
2. session的处理
3. 模板渲染
4. 数据库

今天完成请求封装部分。

实际上对于GET请求的封装,Node.js已经帮我们完成了:

function wrapParam(req){
 if(req.method == 'GET'){
  var queryStr = url.parse(req.url).query;
  if(!queryStr){
   return {};
  }
  return qs.parse(queryStr);
 }else if(req.method == 'POST'){
  // TODO
 }
}

下面只需要对于POST进行解析并封装就可以了。POST请求会触发request的'data'时间,只要监听这个事件就可以了。这里先暂时忽略掉文件上传这回事。

function wrapParam(req){
 if(req.method == 'GET'){
  var queryStr = url.parse(req.url).query;
  if(!queryStr){
   return {};
  }
  return qs.parse(queryStr);
 }else if(req.method == 'POST'){
  req.on('data', function(chunk){
   result = qs.parse(chunk.toString());
  })
 }
}

好是挺好,但是异步编程是无法直接把这个result返回的,所以还需要引入回调函数。

function wrapParam(req, callback){
 if(req.method == 'GET'){
  var queryStr = url.parse(req.url).query;
  if(!queryStr){
   callback({});
  }
  callback(qs.parse(queryStr));
 }else if(req.method == 'POST'){
  req.on('data', function(chunk){
   callback(qs.parse(chunk.toString()));
  })
 }
}

好,到目前为止都很顺利。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/43587db0d6f3ac5eaf92ab20323a50b1.html