第一页 上页 5 6 7 8 9 10 11 12 13 14 下页 最后页 [ 显示模式: 摘要 | 列表 ]

  首先来了解什么是multipart/form-data请求:

根据http/1.1 rfc 2616的协议规定,我们的请求方式只有OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE等,那为为何我们还会有multipart/form-data请求之说呢?这就要从头来说了。

http协议大家都知道是规定了以ASCII码传输,建立在tcp、ip协议之上的应用层规范,规范内容把http请求分为3个部门:状态行,请求头,请求体。所有的方法、实现都是围绕如何运用和组织这三部分来完成的。换句话来说就是万变不离其中,只要我们了解了http请求的组成部分后,自然就可以应变任何实际工作中的需求和问题了。

关于状态行,请求头,请求体等三部分的具体内容,大家可以参考官方的协议文档http://www.faqs.org/rfcs/rfc2616.html,这里主要分析multipart/form-data请求具体是怎么一回事。

既然http协议本身的原始方法不支持multipart/form-data请求,那这个请求自然就是由这些原始的方法演变而来的,具体如何演变且看下文:

1、multipart/form-data的基础方法是post,也就是说是由post方法来组合实现的

2、multipart/form-data与post方法的不同之处:请求头,请求体。

3、multipart/form-data的请求头必须包含一个特殊的头信息:Content-Type,且其值也必须规定为multipart/form-data,同时还需要规定一个内容分割符用于分割请求体中的多个post的内容,如文件内容和文本内容自然需要分割开来,不然接收方就无法正常解析和还原这个文件了。具体的头信息如下:

JavaScript代码
  1. Content-Type: multipart/form-data; boundary=${bound}  

//其中${bound} 是一个占位符,代表我们规定的分割符,可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。如:--------------------56423498738365
4、multipart/form-data的请求体也是一个字符串,不过和post的请求体不同的是它的构造方式,post是简单的name=value值连接,而multipart/form-data则是添加了分隔符等内容的构造体。具体格式如下:

JavaScript代码
  1. --${bound}    
  2. Content-Disposition: form-data; name="Filename"    
  3.     
  4. HTTP.pdf    
  5. --${bound}    
  6. Content-Disposition: form-data; name="file000"; filename="HTTP协议详解.pdf"    
  7. Content-Type: application/octet-stream    
  8.     
  9. %PDF-1.5    
  10. file content    
  11. %%EOF    
  12.     
  13. --${bound}    
  14. Content-Disposition: form-data; name="Upload"    
  15.     
  16. Submit Query    
  17. --${bound}--    

其中${bound}为之前头信息中的分割符,如果头信息中规定为123,那么这里也要为123,;可以很容易看出,这个请求体是多个相同的部分组成的:每一个部分都是以--加分隔符开始的,然后是该部分内容的描述信息,然后一个回车,然后是描述信息的具体内容;如果传送的内容是一个文件的话,那么还会包含文件名信息,以及文件内容的类型。上面的第二个小部分其实是一个文件体的结构,最后会以--分割符--结尾,表示请求体结束。

综上,可以知道要发送一个multipart/form-data的请求,其实任何支持post请求的工具或语言都可以支持,只是自己要稍微包装一下便可。

mysql 常用SQL汇总

[不指定 2016/09/07 15:17 | by 刘新修 ]
SQL代码
  1. 1.用管理员登陆  
  2. mysql -u root -p;   
  3.   
  4. 2.创建数据库  
  5. create database nodeDB;  
  6.   
  7. 3.删除数据库  
  8. drop database nodeDB;  
  9.   
  10. 4.查看数据库  
  11. show databases;  
  12.   
  13. 5.选择目标库  
  14. use nodeDB;  
  15.   
  16. 6.查看目标表所有字段  
  17. select * from user;  
  18.   
  19. 7.创建用户  
  20. //user01只能本地访问  
  21. CREATE USER user01@'localhost' IDENTIFIED BY 'user01';  
  22.   
  23. //user02可以远程访问  
  24. CREATE USER user02@'%' IDENTIFIED BY 'password1';  
  25.   
  26. 8.修改user01密码  
  27. SET PASSWORD FOR 'user01'@'localhost'=PASSWORD('password2');  
  28.   
  29. 9.授权  
  30. //user01管理db01全部权限  
  31. GRANT ALL PRIVILEGES ON nodeDB.* TO user01;  
  32.   
  33. //user02查看权限,并修改密码  
  34. GRANT SELECT  ON *.* TO 'user02'@'%' IDENTIFIED by 'password2';  
  35.   
  36. 10. 刷新数据库  
  37. flush privileges;  

创建测试表:

SQL代码
  1. //判断有库就删除  
  2. drop database if exists school;  
  3. create database school;  
  4. use school;  
  5. create table teacher(  
  6.     id int(3) auto_increment not null primary key,  
  7.     name char(10) not null,  
  8.     address varchar(50) default '深圳',  
  9.     year date  
  10. );  
  11.   
  12. //以下为插入字段  
  13. insert into teacher values(null,'allen','大连一中','1976-10-10');  
  14. insert into teacher values(null,'jack','黄冈中学','1975-12-23');  
  15. insert into teacher values(null,'jesse','北京四中','1980-6-23');  
  16. insert into teacher values(null,'tony','衡水中学','1982-2-12');  
Tags: ,

NodeJs JSONP数据接口定义

[不指定 2016/09/06 18:09 | by 刘新修 ]
JavaScript代码
  1. var http = require('http');    
  2. var urllib = require('url');    
  3.     
  4. var port = 10011;    
  5. var data = {'name': 'jifeng', 'company': 'taobao'};    
  6.     
  7. http.createServer(function(req, res){    
  8.   var params = urllib.parse(req.url, true);    
  9.   console.log(params);    
  10.   if (params.query && params.query.callback) {    
  11.     //console.log(params.query.callback);    
  12.     var str =  params.query.callback + '(' + JSON.stringify(data) + ')';//jsonp    
  13.     res.end(str);    
  14.   } else {    
  15.     res.end(JSON.stringify(data));//普通的json    
  16.   }        
  17. }).listen(port, function(){    
  18.   console.log('server is listening on port ' + port);      
  19. })    

自建Node路由Jsonp接口访问地址:http://liuxinxiu.com:3000/jsonp?Jsoncallback=2016&&name=liuxinxiu

JavaScript代码
  1. function jsonp(){  
  2.     this.exec=function(route,req,res){  
  3.        var data1={key:'value',hello:'world',name:'刘新修'};  
  4.        var data2={'name':'wangjiang','company':'taobao'};  
  5.        console.log(req+'---'+route)  
  6.        res.statusCode=200;  
  7.        //res.setHeader('content-type','application/json;charset=utf-8');  
  8.        //res.setHeader('Content-Type','text/html');  
  9.        //req.write(data);  
  10.        //req.end();  
  11.   
  12.        var params=url.parse(req.url,true);  
  13.        console.log(params);  
  14.        if(params.query&¶ms.query.Jsoncallback){  
  15.            console.log(params.query.Jsoncallback);  
  16.            var str=params.query.Jsoncallback+'('+JSON.stringify(data1)+')';//jsonp  
  17.            res.end(str);  
  18.        }  
  19.        else{  
  20.            res.writeHead(200,{'Content-Type':'application/json'});  
  21.            res.end(JSON.stringify(data1));      //普通的json  
  22.        }  
  23.   
  24.    }  
  25. }  
  26. module.exports=new jsonp();  

自建Node路由Jsonp接口访问地址:http://liuxinxiu.com:3000/Jsoncallback?Jsoncallback=1&name=Jack

JavaScript代码
  1. function jsoncallback(){  
  2.     this.exec=function(route,req,res){  
  3.   
  4.         /******** 处理请求判断用作JSONP ********/  
  5.         var params=url.parse(req.url,true);  
  6.   
  7.         /********** 造数据要Obj不要String **********/  
  8.         var str2={dataList:[{name:"Jack",age:28,sex:1},{name:'Tony',age:30,sex:0}]};  
  9.   
  10.         /********** 映射数据源无为undefined **********/  
  11.         var output=2016+'('+JSON.stringify(str2)+')';  
  12.         var result=params.query.Jsoncallback+'('+JSON.stringify(str2)+')';  
  13.   
  14.         /************* 定义头部信息及编码规范 *******************/  
  15.         res.writeHead(200,{'content-Type':'application/json;charset=utf-8'});  
  16.   
  17.         /************* 判断出来相应返回的结果 ********************/  
  18.         if(params.query&¶ms.query.Jsoncallback){  
  19.             res.write(result);  
  20.             res.end();  
  21.         }  
  22.         else{  
  23.             res.write(output);  
  24.             res.end();  
  25.         }  
  26.     }  
  27. };  
  28. module.exports=new jsoncallback();  
Tags: ,

几个模板引擎的对比

[不指定 2016/09/05 23:56 | by 刘新修 ]

渲染html到页面中,在koa中可以这么干:

JavaScript代码
  1. app.get('/',function*(){  
  2.     this.body = "<p>'+title+'</p>";  
  3. })  

但问题很大,模板混入到js逻辑了,非常不利于维护,基于 mvc 模式,我们需要将html模板抽离到 view 中方便维护,这时候我们就需要一款模板渲染引擎。

为什么选择xtemplate

适用于 koa 的模板引擎选择非常多,比如 jadeejsnunjucksxtemplate 等。

为什么选择 xtemplate 呢?

上手难度

jade 无疑是最独特,上手难度最高,特别是将 html 转成 jade 风格的代码,需要一些成本和适应,特别是空格敏感,经常引起模块渲染报错:

JavaScript代码
  1. body  
  2.     h1 Jade - node template engine  
  3.     #container.col  
  4.       if youAreUsingJade  
  5.         p You are amazing  
  6.       else  
  7.         p Get on it!  

但 jade 在 express 中拥有广泛的群众基础,所以从 express 转到 koa,jade 是个不错的选择,但我一直认为 jade 不是最佳的模板选择。

ejs、nunjucks、xtemplate 的上手难度差不多,但ejs的扩展写法有些诡异,特别是 filter 的写法:

JavaScript代码
  1. <p><%=: users | first | capitalize %></p>  

xtemplate 相对于 nunjucks 的优势是,模板的逻辑写法体验更接近js(ejs的逻辑表达也很接近js),上手更为简单,来看下同样一个 if 判断的写法差异。

xtemplate:

JavaScript代码
  1. {{#if(variable===0)}}  
  2.   It is true      
  3. {{/if}}  

nunjucks:

JavaScript代码
  1. {% if variable == 0 %}  
  2.   It is true  
  3. {% endif %}  

所以上手难度:xtemplate < nunjucks < ejs < jade 。

功能的强大度

四款模板引擎必备几样功能都具备:变量、逻辑表达式、循环、layout、include、宏、扩展等。

nunjucks 无疑是功能最全面的模板引擎,xtemplate 拥有 nunjucks 大部分的特性,除了filter,但 xtemplate 拥有非常强悍的拓展性:

JavaScript代码
  1. xtpl.addCommand('money',function(scope, option){  
  2.     var money = option.params[0];  
  3.     if(typeof money !== 'number') return '';  
  4.     //金额除以100(接口返回的金额都是以分为单位,转成元)  
  5.     var s = Number(money)/100;  
  6.     return s;  
  7. })  

模板中使用:

JavaScript代码
  1. {{money(10000)}}  

nunjucks 与 xtemplate 都拥有实用的宏定义功能:

JavaScript代码
  1. {{#macro("test","param", default=1)}}  
  2.     param is {{param}} {{default}}  
  3. {{/macro}}  

模板中使用:

JavaScript代码
  1. {{macro("test","2")}}  

输出内容:

JavaScript代码
  1. param is 2 1  

jade 中的 Mixins,ejs 中的 function 也可以实现类似的抽取公用html代码块的目的 。

如果真要分个高下:nunjucks > xtemplate > jade > ejs 。

是否支持前后端混用

jade 直接淘汰,相信在前端js领域一般不会选择 jade 来渲染。

nunjucks 也使用的比较少(ejs其实也少),更多人会选择使用 handlebars 。

xtemplate 目前在阿里的系统中前后端混用中已经得到论证,节约了模板前后端转换的时间。

事实上是否支持前后端混用不是决定性因素,特别是在 angularjs 盛行的年代。

性能考量

它们都很快,其实性能都不是问题,真要较真的话,xtemplate 会更优秀些,可以看 xtemplate benchmark

个人觉得性能不是决定性因素。

基于上述几点考虑,推荐使用 xtemplate 。

Tags: ,

PHP处理HTTP请求的几种方式

[不指定 2016/09/05 17:48 | by 刘新修 ]

GET,一般是明文的,比如XXX.php?a=1&b=2,这里的a,b就必须用GET方式接收,接收代码如下:
$a = $_GET['a'];
$b = $_GET['b'];
//接收a,b两个变量
POST,一般是隐藏的非明文的,一般表单设置成POST的,接收方式如下:
//比如有个表单,表单中有两个文本框,name 分别是 a,b,那么代码如下:
$a = $_POST['a'];
$b = $_POST['b'];
另外:$_REQUEST,可以同时接收GET、POST的变量,用法如:
$_REQUEST['a'];//接收变量a,a可以是GET的也可以是POST的

另外说说PHP获取POST请求的几种方式:

方法1、最常见的方法是:$_POST['fieldname'];
说明:只能接收Content-Type: application/x-www-form-urlencoded提交的数据
解释:也就是表单POST过来的数据

方法2、file_get_contents(“php://input”);
说明:
允许读取 POST 的原始数据。
和 $HTTP_RAW_POST_DATA 比起来,它给内存带来的压力较小,并且不需要任何特殊的 php.ini 设置。
php://input 不能用于 enctype=”multipart/form-data”。
解释:
对于未指定 Content-Type 的POST数据,则可以使用file_get_contents(“php://input”);来获取原始数据。
事实上,用PHP接收POST的任何数据都可以使用本方法。而不用考虑Content-Type,包括二进制文件流也可以。
所以用方法二是最保险的方法。

方法3、$GLOBALS['HTTP_RAW_POST_DATA'];
说明:
总是产生 $HTTP_RAW_POST_DATA  变量包含有原始的 POST 数据。
此变量仅在碰到未识别 MIME 类型的数据时产生。
$HTTP_RAW_POST_DATA  对于 enctype=”multipart/form-data”  表单数据不可用
如果post过来的数据不是PHP能够识别的,可以用 $GLOBALS['HTTP_RAW_POST_DATA']来接收,
比如 text/xml 或者 soap 等等
解释:
$GLOBALS['HTTP_RAW_POST_DATA']存放的是POST过来的原始数据。
$_POST或$_REQUEST存放的是 PHP以key=>value的形式格式化以后的数据。
但$GLOBALS['HTTP_RAW_POST_DATA']中是否保存POST过来的数据取决于centent-Type的设置,即POST数据时 必须显式示指明Content-Type: application/x-www-form-urlencoded,POST的数据才会存放到 $GLOBALS['HTTP_RAW_POST_DATA']中。
Tags:

假设URL为:http://localhost:8888/select?name=a&id=5

JavaScript代码
  1. http.createServer(function(request,response){    
  2.         var pathname = url.parse(request.url).pathname;  //pathname => select    
  3.             
  4.         var arg = url.parse(request.url).query;          //arg => name=a&id=5    
  5.         console.log("Request for " + arg );    
  6.         var str = querystring.parse(arg);                //str=> {name:'a',id:'5'}    
  7.             
  8.         var arg1 = url.parse(request.url, true).query;   //arg1 => {name:'a',id:'5'}    
  9.         console.log("Request for " + arg1 );    
  10.             
  11.         var name = querystring.parse(arg).name;         //name => a    
  12.         console.log("name = "+name);    
  13.     
  14.         console.log("Request for " + pathname + " received.");    
  15.     }).listen(8888);    

//querystring.parse(arg)   => { name: 'a', id: '5' }

var url = require('url');
var a = url.parse('http://example.com:8080/one?a=index&t=article&m=default');
console.log(a);

//输出结果:
{
    protocol : 'http' ,
    auth : null ,
    host : 'example.com:8080' ,
    port : '8080' ,
    hostname : 'example.com' ,
    hash : null ,
    search : '?a=index&t=article&m=default',
    query : 'a=index&t=article&m=default',
    pathname : '/one',
    path : '/one?a=index&t=article&m=default',
    href : 'http://example.com:8080/one?a=index&t=article&m=default'
}

Tags: ,

json格式被越来越多的开发者说青睐,我们常常在接口定义时使用这种格式参数进行数据交换.

今天主要给大家从繁到简的几个node.js下使用的提交 json个数参数的方式方法.

下面示例中出现的参数都做了处理,拷贝代码后需要更改这些参数同时自己写一个接收json格式的api,请求成功后再返回json格式

(一) node.js 原生自带http模块,可以解决基于http协议下的请求及回发,执行效率高,但是好多东西需要开发人员自己动手来实现,看下面代码

JavaScript代码
  1. var http=require('http');  
  2.   
  3. var body = {  
  4.     "data":{  
  5.         "channel" : "aaa",  
  6.         "appkey" : "bbb"  
  7.     },  
  8.     "sign" : "22334455",  
  9.     "token" : "bb667788"  
  10. };  
  11.   
  12. var bodyString = JSON.stringify(body);  
  13.   
  14. var headers = {  
  15.   'Content-Type''application/json',  
  16.   'Content-Length': bodyString.length  
  17. };  
  18.   
  19.   
  20. var options = {  
  21.   host: '127.0.0.1',  
  22.   port: 3005,  
  23.   path: '/Config',  
  24.   method: 'POST',  
  25.   headers: headers  
  26. };  
  27.   
  28. var req=http.request(options,function(res){  
  29.     res.setEncoding('utf-8');  
  30.   
  31.     var responseString = '';  
  32.   
  33.     res.on('data'function(data) {  
  34.         responseString += data;  
  35.     });  
  36.   
  37.     res.on('end'function() {  
  38.     //这里接收的参数是字符串形式,需要格式化成json格式使用  
  39.         var resultObject = JSON.parse(responseString);  
  40.         console.log('-----resBody-----',resultObject);  
  41.     });  
  42.   
  43.     req.on('error'function(e) {  
  44.         // TODO: handle error.  
  45.         console.log('-----error-------',e);  
  46.     });  
  47. });  
  48. req.write(bodyString);  
  49. req.end();  

http模块比较原始,请求参数里我们要手动指定请求头类型,头长度,请求方式,主机头和端口等.

当我们将json格式参数post上去以后,得到的response 对象需要我们在 data 事件上手动处理获取到的数据, end 事件表示接收数据流已结束, error 事件是当回发数据发生错误时将自动触发此事件响应函数

(二)

大名鼎鼎的 request 模块上场了,这个模块帮我们做了很多我们不关心的东西,比如请求后得到的 response 对象,我们将不会非常繁琐的去手动捕获 data ,end ,error 事件. 取而代之的是回调函数里直接将我们关心的回发数据放到了一个变量里,看下面的代码:

此模块并发node.js 原生自带模块,首先需要 npm install request ,下面代码的参数同样做了处理

JavaScript代码
  1. var request=require('request');  
  2.   
  3. var options = {  
  4.     headers: {"Connection""close"},  
  5.     url: 'http://127.0.0.1:3005/Config',  
  6.     method: 'POST',  
  7.     json:true,  
  8.     body: {data:{channel : "aaa",appkey : "bbb"},sign : "ccc",token : "ddd"}  
  9. };  
  10.   
  11. function callback(error, response, data) {  
  12.     if (!error && response.statusCode == 200) {  
  13.         console.log('----info------',data);  
  14.     }  
  15. }  
  16.   
  17. request(options, callback);  

代码明显比第一种方式少了很多,callback 里面的 data 参数就是我们请求路径后得到的内容,而且我们在 options 中指定了 json:true ,所以请求和回发的数据自动转变成了 json 对象.我们看下这次的运行结果:

node request.js

下面还有一种更简单的方法和大家分享

(三)

也是一个第三方模块,叫做 request-json

看名字就非常容易理解,有关json 格式参数的请求模块,使用也非常方便.

首先 npm install request-json  安装此模块,定义好 json请求参数对象,见下面代码:

JavaScript代码
  1. request = require('request-json');  
  2. var client = request.newClient('http://127.0.0.1:3005/');  
  3.   
  4. var data = {data:{channel : "aaa",appkey : "bbb"},sign : "4444",token : "555"};  
  5. client.post('Config', data, function(err, res, body) {  
  6.   console.log(res.statusCode,body);  
  7. });  

返回的body 也是自动序列化成json对象,见运行结果

前面的 200 是 res.statusCode 回发状态值,接着输出的是我们得到的json对象,无论从使用还是理解上,都是最简单的一种方法.

nodeJs构建一个HttpServer

[不指定 2016/09/04 20:19 | by 刘新修 ]

将下面代码放入server.js中

JavaScript代码
  1. var http = require("http");    
  2. http.createServer(function(request, response) {    
  3.     console.log('request received');    
  4.     response.writeHead(200, {"Content-Type": "text/plain"});    
  5.     response.write("Hello World");    
  6.     response.end();    
  7. }).listen(8888);    
  8. console.log('server started');    

执行node server.js
打开http://localhost:8888/,页面显示Hello World

JavaScript代码
  1. var http=require('http');  
  2.   
  3. var data={key:'value', hello:'world'};  
  4. var srv=http.createServer(function (req, res) {  
  5.   res.writeHead(200,{'Content-Type': 'application/json'});  
  6.   res.end(JSON.stringify(data));  
  7. });  
  8.   
  9. srv.listen(8080,function() {  
  10.   console.log('listening on localhost:8080');  
  11. });  

 

Tags: ,

首先执行:npm install node-uuid -g

JavaScript代码
  1. var uuid = require('node-uuid');
  2. //var uuid = require('/usr/local/nodejs/lib/node_modules/node-uuid');
  3. console.log(uuid.v1())    
  4. console.log(uuid.v4())    

注明:如果在linux下编译安装node可以使用软连接ls 或这直接写绝对路径引入需要的nmp模块!

v1 是基于时间戳生成uuid

v4是随机生成uuid

结果:

 

  1. 57af5b10-3a76-11e5-922a-75f42afeee38  
  2. f3917fb9-9bde-4ec1-a7cf-966251b3d22a  
Tags: ,

你肯定非常熟悉nodejs模块中的exports对象,你可以用它创建你的模块。例如:(假设这是rocker.js文件)

JavaScript代码
  1. exports.name = function() {  
  2.     console.log('My name is Lemmy Kilmister');  
  3. };  

在另一个文件中你这样引用

JavaScript代码
  1. var rocker = require('./rocker.js');  
  2. rocker.name(); // 'My name is Lemmy Kilmister'  

那到底Module.exports是什么呢?它是否合法呢?

其实,Module.exports才是真正的接口,exports只不过是它的一个辅助工具。 最终返回给调用的是Module.exports而不是exports。

所有的exports收集到的属性和方法,都赋值给了Module.exports。当然,这有个前提,就是Module.exports本身不具备任何属性和方法。如果,Module.exports已经具备一些属性和方法,那么exports收集来的信息将被忽略。

修改rocker.js如下:

JavaScript代码
  1. module.exports = 'ROCK IT!';  
  2. exports.name = function() {  
  3.     console.log('My name is Lemmy Kilmister');  
  4. };  

再次引用执行rocker.js

JavaScript代码
  1. var rocker = require('./rocker.js');  
  2. rocker.name(); // TypeError: Object ROCK IT! has no method 'name'  

发现报错:对象“ROCK IT!”没有name方法

rocker模块忽略了exports收集的name方法,返回了一个字符串“ROCK IT!”。由此可知,你的模块并不一定非得返回“实例化对象”。你的模块可以是任何合法的javascript对象--boolean, number, date, JSON, string, function, array等等。

你的模块可以是任何你设置给它的东西。如果你没有显式的给Module.exports设置任何属性和方法,那么你的模块就是exports设置给Module.exports的属性。

下面例子中,你的模块是一个类:

JavaScript代码
  1. module.exports = function(name, age) {  
  2.     this.name = name;  
  3.     this.age = age;  
  4.     this.about = function() {  
  5.         console.log(this.name +' is 'this.age +' years old');  
  6.     };  
  7. };  

可以这样应用它:

JavaScript代码
  1. var Rocker = require('./rocker.js');  
  2. var r = new Rocker('Ozzy', 62);  
  3. r.about(); // Ozzy is 62 years old  

下面例子中,你的模块是一个数组:

JavaScript代码
  1. module.exports = ['Lemmy Kilmister''Ozzy Osbourne''Ronnie James Dio''Steven Tyler''Mick Jagger'];  

可以这样应用它:

JavaScript代码
  1. var rocker = require('./rocker.js');  
  2. console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio  

现在你明白了,如果你想你的模块是一个特定的类型就用Module.exports。如果你想的模块是一个典型的“实例化对象”就用exports。

给Module.exports添加属性类似于给exports添加属性。例如:

JavaScript代码
  1. module.exports.name = function() {  
  2.     console.log('My name is Lemmy Kilmister');  
  3. };  

同样,exports是这样的

JavaScript代码
  1. exports.name = function() {  
  2.     console.log('My name is Lemmy Kilmister');  
  3. };  

请注意,这两种结果并不想同。前面已经提到module.exports是真正的接口,exports只不过是它的辅助工具。推荐使用exports导出,除非你打算从原来的“实例化对象”改变成一个类型。

第一页 上页 5 6 7 8 9 10 11 12 13 14 下页 最后页 [ 显示模式: 摘要 | 列表 ]