Nodejs

Node.js是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。

回调函数


由于node是一个异步事件驱动的平台,所以在代码中我们经常需要使用回调函数。下面是回调函数应用的经典示例:

  
  1. setTimeout(function(){
  2. console.log('callback is called');
  3. },2000);

我们传给setTimeout函数传入了一个匿名函数和一个调用时间2000(毫秒),运行程序后等待2秒,可以看到输出了"callback is called"。

标准回调函数


node.js中回调函数格式是约定俗成的,它有两个参数,第一个参数为err,第二个参数为data,顾名思义,err是错误信息,data则是返回的数据,示例如下:

  
  1. function(err,data){
  2.  
  3. }

为了养成良好的编码习惯,在以后的课程示例或练习中,回调函数格式都将采用这样的格式。

获取模块


为了支持快速开发,node平台上提供了大量的模块,封装了各自不同的功能,那么我们将如何调获取想要的模块呢,下来我们就来介绍。在node中,我们可以使用require函数,具体语法如下:

  
  1. require("模块");

怎么样,是不是很简单很方便,通过require函数我们就可以获取相应模块进而使用它的任意功能了。

使用模块


os模块可提供操作系统的一些基本信息,它的一些常用方法如下:

  
  1. var os = require("os");
  2.  
  3. var result = os.platform(); //查看操作系统平台
  4. //os.release(); 查看操作系统版本
  5. //os.type(); 查看操作系统名称
  6. //os.arch(); 查看操作系统CPU架构
  7.  
  8. console.log(result);

简介


process是一个全局内置对象,可以在代码中的任何位置访问此对象,这个对象代表我们的node.js代码宿主的操作系统进程对象。

使用process对象可以截获进程的异常、退出等事件,也可以获取进程的当前目录、环境变量、内存占用等信息,还可以执行进程退出、工作目录切换等操作。

cwd函数的基本用法

当我们想要查看应用程序当前目录时,可以使用cwd函数,使用语法如下:

  
  1. process.cwd();

chdir函数的基本用法


如果需要改变应用程序目录,就要使用chdir函数了,它的用法如下:

  
  1. process.chdir("目录");

stdout的基本用法

stdout是标准输出流,它是干什么的呢?请下看下面的示例:

  
  1. console.log = function(d){
  2. process.stdout.write(d+'\n');
  3. }

没错,它的作用就是将内容打印到输出设备上,console.log就是封装了它。

stderr的基本用法

stderr是标准错误流,和stdout的作用差不多,不同的是它是用来打印错误信息的,我们可以通过它来捕获错误信息,基本使用方法如下:

  
  1. process.stderr.write(输入内容);

stdin的基本用法

stdin是进程的输入流,我们可以通过注册事件的方式来获取输入的内容,如下:

  
  1. process.stdin.on('readable', function() {
  2. var chunk = process.stdin.read();
  3. if (chunk !== null) {
  4. process.stdout.write('data: ' + chunk);
  5. }
  6. });

示例中的chunk就是输入流中的内容。

exit函数的基本用法

如果你需要在程序内杀死进程,退出程序,可以使用exit函数,示例如下:

  
  1. process.exit(code);

参数code为退出后返回的代码,如果省略则默认返回0;

注册事件

前面讲到如何在输入流中打印信息,当我们需要获取stdout内容的时候应该怎么做呢?请看如下的示例:

  
  1. process.stdout.on('data',function(data){
  2. console.log(data);
  3. });

为stdout注册data事件,我们就可以拿到它输出的内容了。

设置编码

在我们的输入输出的内容中有中文的时候,可能会乱码的问题,这是因为编码不同造成的,所以在这种情况下需要为流设置编码,如下示例:

  
  1. process.stdin.setEncoding(编码);
  2.  
  3. process.stdout.setEncoding(编码);
  4.  
  5. process.stderr.setEncoding(编码);

文件I/O fs模块的基本用法


开发中我们经常会有文件I/O的需求,node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装。

writeFile函数的基本用法


文件I/O,写入是必修课之一。fs模块提供writeFile函数,可以异步的将数据写入一个文件, 如果文件已经存在则会被替换。用法如下:

例:fs.writeFile(filename, data, callback)

  
  1. var fs= require("fs");
  2.  
  3. fs.writeFile('test.txt', 'Hello Node', function (err) {
  4. if (err) throw err;
  5. console.log('Saved successfully'); //文件被保存
  6. });
  7.  

数据参数可以是string或者是Buffer,编码格式参数可选,默认为"utf8",回调函数只有一个参数err。

appendFile函数的基本用法

writeFile函数虽然可以写入文件,但是如果文件已经存在,我们只是想添加一部分内容,它就不能满足我们的需求了,很幸运,fs模块中还有appendFile函数,它可以将新的内容追加到已有的文件中,如果文件不存在,则会创建一个新的文件。使用方法如下:

例:fs.appendFile(文件名,数据,编码,回调函数(err));

  
  1. var fs= require("fs");
  2.  
  3. fs.appendFile('test.txt', 'data to append', function (err) {
  4. if (err) throw err;
  5.  
  6. //数据被添加到文件的尾部
  7. console.log('The "data to append" was appended to file!');
  8. });

编码格式默认为"utf8",

exists函数的基本用法

如何检查一个文件是否存在呢?我想exists函数可以帮助你,用法如下:

例:fs.exists(文件,回调函数(exists));

exists的回调函数只有一个参数,类型为布尔型,通过它来表示文件是否存在。

  
  1. var fs= require("fs");
  2.  
  3. fs.exists('/etc/passwd', function (exists) {
  4. console.log(exists ? "存在" : "不存在!");
  5. });

rename函数的基本用法


修改文件名称是我们经常会遇见的事情,rename函数提供修改名称服务:

  
  1. var fs= require("fs");
  2.  
  3. fs.rename(旧文件,新文件,回调函数(err){
  4. if (err) throw err;
  5. console.log('Successful modification,');
  6. });

移动文件也是我们经常会遇见的,可是fs没有专门移动文件的函数,但是我们可以通过rename函数来达到移动文件的目的,示例如下。

  
  1. var fs = require('fs');
  2.  
  3. fs.rename(oldPath,newPath,function (err) {
  4. if (err) throw err;
  5. console.log('renamed complete');
  6. });

readFile函数的基本用法


读取文件是最常用到的功能之一,使用fs模块读取文件语法如下:

例:fs.readFile(文件,编码,回调函数);

  
  1. var fs = require('fs');
  2.  
  3. fs.readFile(文件名, function (err, data) {
  4. if (err) throw err;
  5. console.log(data);
  6. });

回调函数里面的data,就是读取的文件内容。


面对一堆垃圾的文件总是有想删除的冲动,我有强迫症?你才有呢。

好在有unlink函数,终于得救了,示例如下:

例:fs.unlink(文件,回调函数(err));

  
  1. var fs = require('fs');
  2.  
  3. fs.unlink(文件, function(err) {
  4. if (err) throw err;
  5. console.log('successfully deleted');
  6. });

mkdir函数的基本用法


除了针对文件的操作,目录的创建、删除也经常遇到的,下面我们来看看node.js中如何创建目录:

  
  1. fs.mkdir(路径,权限,回调函数(err));

参数

  1. 路径:新创建的目录。
  2. 权限:可选参数,只在linux下有效,表示目录的权限,默认为0777,表示文件所有者、文件所有者所在的组的用户、所有用户,都有权限进行读、写、执行的操作。
  3. 回调函数:当发生错误时,错误信息会传递给回调函数的err参数。

rmdir函数的基本用法


删除目录也是必不可少的功能,rmdir函数可以删除指定的目录:

例:fs.rmdir(路径,回调函数(err));

  
  1. var fs = require('fs');
  2.  
  3. fs.rmdir(path, function(err) {
  4. if (err) throw err;
  5. console.log('ok');
  6. });

readdir函数的基本用法


如果要读取目录下所有的文件应该怎么办呢?readdir函数可以读取到指定目录下所有的文件,示例如下:

  
  1. var fs = require('fs');
  2.  
  3. fs.readdir(目录,回调函数(err,files));

回调函数 (callback) 接受两个参数 (err, files) 其中 files 是一个存储目录中所包含的文件名称的数组,数组中不包括 '.' 和 '..'。

小结


文件I/O是最基本的操作,应该熟悉掌握。

fs模块不但提供异步的文件操作,还提供相应的同步操作方法,需要指出的是,nodejs采用异步I/O正是为了避免I/O时的等待时间,提高CPU的利用率,所以在选择使用异步或同步方法的时候需要权衡取舍。

本节课程讲解了fs模块常用的一些功能,当然它还有更多强大的功能,如果你想了解更多,可以参考以下资料:


url处理 url模块的基本用法


node.js为互联网而生,和url打交道是无法避免的了,url模块提供一些基础的url处理。

parse函数的基础用法


parse函数的作用是解析url,返回一个json格式的数组,请看如下示例:

  
  1. var url = require('url');
  2. url.parse('http://www.baidu.com');

运行结果:

  
  1. { protocol: 'http:',
  2. slashes: null,
  3. auth: null,
  4. host: null,
  5. port: null,
  6. hostname: null,
  7. hash: null,
  8. search: null,
  9. query: null,
  10. pathname: 'www.baidu.com',
  11. path: 'www.baidu.com',
  12. href: 'http://www.baidu.com' }

parse函数 —— 条件解析


parse函数的第二个参数是布尔类型,当参数为true时,会将查询条件也解析成json格式的对象。

  
  1. var url = require('url');
  2. url.parse('http://www.baidu.com?page=1',true);

运行结果:

  
  1. { protocol: 'http:',
  2. slashes: true,
  3. auth: null,
  4. host: 'www.baidu.com',
  5. port: null,
  6. hostname: 'www.baidu.com',
  7. hash: null,
  8. search: '?page=1',
  9. query: { page: '1' },
  10. pathname: '/',
  11. path: '/?page=1',
  12. href: 'http://www.baidu.com/?page=1' }

parse函数 —— 解析主机


parse函数的第三个参数也是布尔类型的,当参数为true,解析时会将url的"//"和第一个"/"之间的部分解析为主机名,示例如下:

  
  1. var url = require('url');
  2. url.parse('http://www.baidu.com/news',false,true);

运行结果:

  
  1. { protocol: 'http:',
  2. slashes: true,
  3. auth: null,
  4. host: 'www.baidu.com',
  5. port: null,
  6. hostname: 'www.baidu.com',
  7. hash: null,
  8. search: null,
  9. query: null,
  10. pathname: '/news',
  11. path: '/news',
  12. href: 'http://www.baidu.com/news' }

较之前面的示例,host的内容不再是null了。

format函数的基础用法


format函数的作用与parse相反,它的参数是一个JSON对象,返回一个组装好的url地址,请看如下示例:

  
  1. var url = require('url');
  2. url.format({
  3. protocol: 'http:',
  4. hostname:'www.baidu.com',
  5. port:'80',
  6. pathname :'/news',
  7. query:{page:1}
  8. });

运行结果:

  
  1. http://www.baidu.com/news?page=1

参数JSON对象的字段跟parse函数解析后返回的JSON字段一一对应。

resolve函数的基础用法


resolve函数的参数是两个路径,第一个路径是开始的路径或者说当前路径,第二个则是想要去往的路径,返回值是一个组装好的url,示例如下:

  
  1. var url = require('url');
  2.  
  3. url.resolve('http://example.com/', '/one') // 'http://example.com/one'
  4. url.resolve('http://example.com/one', '/two') // 'http://example.com/two'

小结


本节课程讲解了url模块常用的一些功能,如果你想了解更多,可以参考以下资料:


path优化 path模块的基本用法


本模块包含一套用于处理和转换文件路径的工具集,用于处理目录的对象,提高用户开发效率,让我们一起来快速的认识path对象的一些常用方法吧!

normalize函数的基本用法


normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还能去掉多余的斜杠。

如下示例:

  
  1. var path = require('path');
  2. var data = path.normalize('/path///normalize/hi/..');
  3. console.log(data);

运行结果:

  
  1. '/path/normalize/'

join函数的基本用法


join函数将传入的多个路径拼接为标准路径并将其格式化,返回规范后的路径,避免手工拼接路径字符串的繁琐. 如下示例:

  
  1. var path = require('path');
  2. var data = path.join('///you', '/are', '//beautiful');
  3. console.log(data);

运行结果:

  
  1. '/you/are/beautiful'

dirname函数的基本用法


dirname函数用来返回路径中的目录名. 如下示例:

  
  1. var path = require('path');
  2. var data = path.dirname('/foo/strong/cool/nice');
  3. console.log(data);

运行结果:

  
  1. '/foo/strong/cool'

basename函数的基本用法


basename函数可返回路径中的最后一部分,并且可以对其进行条件排除. 如下示例:

例1:path.basename('路径字符串');

例2:path.basename('路径字符串', '[ext]')<排除[ext]后缀字符串>;

  
  1. var path = require('path');
  2. var data1 = path.basename('/foo/strong/basename/index.html');
  3. var data2 = path.basename('/foo/strong/basename/index.html','.html');
  4. console.log(data1 + ' "and" ' + data2);

运行结果:

  
  1. 'index.html "and" index'
extname函数的基本用法

extname函数返回路径中文件的扩展名(以最后一个'.'开始,返回'.'以及'.'以后的所有字符串,如没有'.',则返回空字符串). 如下示例:

  
  1. var path = require('path');
  2. var data = path.extname('index.html');
  3. console.log(data);

运行结果:

  
  1. '.html'

字符串转换 Query String模块的基本介绍


Query String模块用于实现URL参数字符串与参数对象之间的互相转换,提供了"stringify"、"parse"等一些实用函数来针对字符串进行处理,通过序列化和反序列化,来更好的应对实际开发中的条件需求,对于逻辑的处理也提供了很好的帮助,下面就让我们一起来了解学习它吧!

stringify函数的基本用法


stringify函数的作用就是序列化对象,也就是说将对象类型转换成一个字符串类型(默认的分割符("&")和分配符("=")),本节先介绍它的基本用法,在下一节里我们将学习如何替换默认分配符,下面我们就通过以下例子来清楚的认识一下吧!

例1:querystring.stringify("对象")

  
  1. var querystring= require('querystring');
  2. var result = querystring.stringify({foo:'bar',cool:['xux', 'yys']});
  3. console.log(result);

运行结果:

  
  1. foo=bar&cool=xux&cool=yys

stringify函数的多参数用法


这节我们来学习stringify函数的多参数用法,上节我们知道了对象被序列化为字符串之后默认是通过分割符("&")和分配符("=")组成的,那可不可以改变呢,这节我们就来了解一下,是否可以自己去定义组合结果,看下面的小例子

例1:querystring.stringify("对象","分隔符","分配符")

  
  1. var querystring = require('querystring');
  2. var result = querystring.stringify({foo:'bar',cool:['xux', 'yys']},'*','$');
  3. console.log(result);

运行结果:

  
  1. 'foo$bar*cool$xux*cool$yys'

parse函数的基本用法


刚刚我们已经学习了stringify函数的作用,接下来就来学习反序列化函数——parse函数,parse函数的作用就是反序列化字符串(默认是由"="、"&"拼接而成),转换得到一个对象类型。如下示例:

例1:querystring.parse("字符串")

  
  1. var querystring = require('querystring');
  2. var result = querystring.parse('foo=bar&cool=xux&cool=yys');
  3. console.log(result);

运行结果:

  
  1. { foo: 'bar', cool: ['xux', 'yys']}

parse函数的多参数用法


现在我们学习parse函数的扩展用法,和上节stringify函数的多参数用法不同的是,parse函数可以根据用户所自定义的分割符、分配符来反序列化字符串,从而得到相应的对象结果.如下示例:

例1:querystring.parse("字符串","分隔符","分配符")

  
  1. var querystring = require('querystring');
  2. var result = querystring.parse('foo@bar$cool@xux$cool@yys','@','$');
  3. console.log(result);

运行结果:

  
  1. { foo: '', bar: 'cool', xux: 'cool', yys: '' }

















Node.js 使用 事件驱动, 非阻塞 I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时应用。
Node是一个Javascript运行环境(runtime)。实际上它是对Google V8引擎进行了封装。V8引 擎执行Javascript的速度非常快,性能非常好。
Node对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。

Node.js的优点
nodejs作为一个新兴的后台语言,有很多吸引人的地方:
RESTful API
单线程
Node.js可以在不新增额外线程的情况下,依然可以对任务进行并行处理 —— Node.js是单线程的。它通过事件轮询(event loop)来实现并行操作,对此,我们应该要充分利用这一点 —— 尽可能的避免阻塞操作,取而代之,多使用非阻塞操作。
非阻塞IO
V8虚拟机
事件驱动
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值