您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
 
   
 
  
每天15篇文章
不仅获得谋生技能
更可以追随信仰
 
     
   
 订阅
  捐助
初步认识Node.js
 
556 次浏览     评价:  
  2018-5-14 
 
编辑推荐:
本文来自于网络 介绍了CommonJS规范,全局对象,内置模块,Node.js实现HTTP服务器程序,Node.js实现文件服务器等知识。

CommonJS规范

每一个js文件都是一个模块,js文件的名字就是模块的名字。每个模块内部使用的变量名和函数名互不冲突。

一个模块想要对外暴露变量(函数也是变量),可以用module.exports = variable,还可以exports.variable=variable;如果要输出一个键值对象{},可以利用exports这个已存在的空对象{},并继续在上面添加新的键值;如果要输出一个函数或数组,必须直接对module.exports对象赋值。

一个模块要引用其他模块暴露的变量,用var ref = require('module_name');就拿到了引用模块的变量。在引用模块时要把相对路径写对,直接写模块名会依次在内置模块、全局模块和当前模块下查找。

全局对象

node.js的全局对象global相当于浏览器环境中的全局对象window。

根据全局对象判断JavaScript的执行环境;

if(typeof(window)==='undefined'){
console.log('node.js');
}else{
console.log('browser');
}

node.js的process对象

process=global.process,代表当前Node.js进程;

process.nextTick(function(){});nextTick中的函数不会立刻执行,而是要等到下一次事件循环;

process.on('exit',function(){});在程序即将退出时执行该回调函数。

内置模块

fs模块

文件系统模块,负责读写文件。fs模块同时提供了异步和同步的方法。

异步方法

因为JavaScript的单线程模型,执行IO操作时,JavaScript代码无需等待,而是传入回调函数后,继续执行后续JavaScript代码。

$.getJSON ('http://example.com /ajax',function(data ) {
console.log ('IO结果返回执行...');
});
console.log ('不等待IO结果直接执行后续代码...');

同步方法

同步方法:同步的IO操作则需要等待函数返回。

var data=getJSONSync ('http://example.com/ajax');

同步操作的好处是代码简单,缺点是程序将等待IO操作,在等待时间内,无法响应其它任何事件。而异步读取不用等待IO操作,但代码较麻烦。

异步与同步

由于Node环境执行的JavaScript代码是服务器端代码,所以,绝大部分需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码,否则,同步代码在执行时期,服务器将停止响应,因为JavaScript只有一个执行线程。

服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时,可以使用同步代码,因为这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行。

异步读文件

'use strict';
var fs=require('fs');
fs.readFile('sample.txt','utf-8',function (err ,data ) {
if(err){
console.log (err);
}else{
console.log (data);
}
});
console.log ('start process');

sample.txt文件必须在当前目录,utf-8为文件的编码;

node.js标准的回调函数,第一个参数代表错误信息,第二个参数代表结果;

当读取二进制文件时,不传入文件编码时,回调函数的data参数将返回一个Buffer对象。在Node.js中,Buffer对象就是一个包含零个或任意个字节的数(注意和Array不同)。

Buffer对象与String之间的转换:

Buffer-> String:var text=data.toString ('utf-8');
String-> Buffer:var buf=Buffer.from (text,'utf-8 ');

同步读文件

'use strict';
var fs=require('fs');
try{
var data=fs.readFileSync ('sample.txt','utf-8');
console .log (data);
}catch (err){
console.log (err);
}
console.log ('start');

异步写文件

'use strict'
var fs=require('fs');
var data='write data into file';
fs.writeFile ('sample.txt',data,function (err){
if (err){
console.log(err);
}else{
console.log('done!');
}
});

writeFile()的参数依次为文件名、数据和回调函数。如果传入的数据是String,默认按UTF-8编码写入文本文件,如果传入的参数是Buffer,则写入的是二进制文件。回调函数由于只关心成功与否,因此只需要一个err参数。

同步写文件

'use strict';
var fs=require('fs');
var data='write date into file';
fs.writeFileSync ('output.txt',data);

获取文件大小、创建时间等信息

fs.stat()返回一个Stat对象,能告诉我们文件或目录的详细信息。

//异步
'use strict';
var fs=require('fs');
fs.stat('sample.txt',function(err,stat){
if(err){
console.log(err);
}else{
console.log('isFile:'+stat.isFile());
console.log('isDirectory:'+stat.isDirectory());
if(stat.isFile()){
console.log('size:'+stat.size);
console.log('birth time:'+stat.birthtime);
console.log('modified time:'+stat.mtime);
}
}
});
//同步
'use strict';
var fs=require('fs');
try{
var stat=fs.statSync ('sample.txt');
console.log ('isFile:'+stat.isFile());
console.log ('isDirectory:'+stat.isDirectory());
if(stat.isFile( )){
console. log ('size:'+stat.size);
console.log ('birth time:'+stat.birthtime);
console.log ('modified time:'+stat.mtime);
}
}catch(err){
console.log (err);
}

流读写文件

所有能读取数据的流都继承自stream.Readable;所有能写入数据的流都继承自stream.Writable;

//读操作
'use strict';
var fs = require('fs');
var rs = fs.createReadStream ('sample.txt', 'utf-8' )
rs.on('data', function (chunk) {//data事件表示流的数据已经可以读取。
console.log('DATA:');
console.log(chunk);
});
rs.on('end', function () {//end事件表示这个流已经到了末尾,没有数据可读。
console.log('END');
});
rs.on('error', function (err) { //error表示事件出错。
console.log ('ERROR: ' + err);
});
//写操作
var ws=fs.createWriteStream ('sample.txt','utf-8');
ws.write ('write data into file with stream');
ws.end;

pipe

一个Readable流和一个Writable流串起来后,所有数据自动从Readable流进入Writeable流,这种操作叫pipe。

默认情况下,当Readable流的数据读取完毕,end事件触发后,将自动关闭Writable流。如果我们不希望自动关闭Writable流,需要传入参数

readable.pipe(writable,{end:false});

Node.js实现HTTP服务器程序

处理TCP连接,解析HTTP都由http模块完成了,HTTP请求和HTTP响应都分别封装在http模块中的request对象和response对象中。

//简单的HTTP服务程序
'use strict';
var http=require('http');
var server=http.createServer (function (request ,response ){
console.log (request.method +":"+request.url);
response.writeHead(200,{'Content-Type ':' text/ html ' });
response.end ('<h1>hello world</h1>');
} );
server.listen (8080);
console.log ('Server is running at http: // 127.0. 0 . 1 : 8080/') ;

Node.js实现文件服务器

解析URL需要用到Node.js提供的url模块,通过parse()将一个字符串解析为一个Url对象;

处理本地文件目录需要使用Node.js提供的path模块,使用path模块可以正确处理操作系统相关的文件路径;

//简单的文件服务器
'use strict';
var
fs=require ('fs'),
url=require ('url'),
path=require ('path'),
http=require ('http');
// 从命令行参数获取root目录,默认是当前目录
var root = path.resolve (process.argv[2] || '.');
console.log (process.argv[2]);
console.log ('Static root dir: ' + root);
var server=http. createServer (function(request , response ){
var pathname = url.parse (request.url).pathname;
var filepath = path.join (root, pathname);
fs.stat(filepath, function (err, stats) {
if (!err && stats.isFile()) {
console .log ('200 ' + request.url);
response.writeHead (200,{'Content-Type':' text/html ; charset = utf-8'});
//response.write ('<meta charset="utf-8"/> ');
fs . createReadStream (filepath).pipe(response);//由于 response对象本身是一个Writable Stream,直接用pipe () 方法就实现了自动读取文件内容并输出到HTTP响应
} else {
console. log ('404 ' + request.url);
response.writeHead (404);
response.end ('404 Not Found');
}
});
});
server.listen (8080);
console.log ('Server is running at http://127.0.0.1:8080/');

node.js的加密模块crypto

crypto模块的目的是为了提供通用的加密和哈希算法,Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaScript接口。

MD5和SHA1

const crypto=require ('crypto');
const hash=crypto.createHash ('md5');
// 098f6bcd4621d373cade4e832627b4f6
// const hash=crypto.createHash('sha1'); //a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
hash.update('test');
//update () 方法默认字符串编码为UTF-8,也可以传入Buffer
console.log(hash.digest ('hex'));
//以十六进制的方式输出

   
556 次浏览  评价: 差  订阅 捐助
相关文章

深度解析:清理烂代码
如何编写出拥抱变化的代码
重构-使代码更简洁优美
团队项目开发"编码规范"系列文章
相关文档

重构-改善既有代码的设计
软件重构v2
代码整洁之道
高质量编程规范
相关课程

基于HTML5客户端、Web端的应用开发
HTML 5+CSS 开发
嵌入式C高质量编程
C++高级编程
每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号