node.js

Posted Alieen617

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js相关的知识,希望对你有一定的参考价值。

 

 

node.js基于谷歌的v8引擎,将谷歌的v8引擎单独拿出来 运行在服务器端

 

 

 全局对象

Node.js   ---->     global

在一个文件中,声明的变量和函数都属于局部变量或局部函数,在交互模式下属于全局变量或全局函数;

例1:

var a=1;
console.log(global.a);

例2:

function fn(){
    console.log(123);
}
var res=global.fn();
console.log(res);

 JS:window

在浏览器下,文件中声明的变量或创建的函数都属于是全局作用域下的,可以使用全局对象访问;

xxx.html

<script src="xxx.js"></script>

xxx.js

var a=1;
function fn(){
    console.log(123);
}
console.log(a);
fn()
console.log(window.a);
window.fn();

 console对象

global.console.log(123);      // 打印消息
// 返回值:123
global.console.info(123);     // 打印消息
global.console.warn(123);     // 打印警告消息,感叹号
global.console.error(123);    // 打印错误消息,叉号

// 开始计时
global.console.time(\'for-loop\');
for(var i=0;i<10;i++){

}
// 计时结束
global.console.timeEnd(\'for-loop\');

process对象 --->  查看当前计算机的进程

语法:process.arch                // 多少当前cpu架构

           process.platform         // 什么当前操作系统

           process.env                // 查看当前计算机的环境变量

           process.version          // 查看node.js的版本号

           process.pid                 // 进程编号

           process.kill(pid)          // 杀死进程

buffer对象 --->  缓冲区(在内存中存储数据的区域,存储网络传出时的资源)

// 创建buffer,大小是5个字节
var buf=global.Buffer.alloc(5,\'abcde\');
console.log(buf);
// 将buffer数据转成普通字符
console.log(buf.toString());

全局函数

parseInt / parseFloat / encodeURI / decodeURI  / isNaN  /  isFinite  /eval

console.log(global.parseInt(3.14));     // 3 

1) 一次性定时器

// 定时器,参数1是执行的操作,参数2是间隔的时间(ms),当间隔时间到了就执行回调函数
var timer = setTimeout(function(){
    console.log(\'响铃\');
},3000);

// 清除一次性定时器
clearTimeout(timer);

2)周期性定时器

// 周期性定时器,每间隔3秒响一次
var timer = setInterval(function(){
    console.log(\'响铃\');
},3000);

// 清除
clearInterval(timer);

例1:

// 使用周期性定时器每隔3秒打印hello,打印三次后清楚定时器
// 初始化1个变量用于记录执行次数
var i=0;
var timer = setInterval(function(){
    i++;
    console.log(\'hello\');
    // 当i为3的时候清除定时器
    if(i==3){
        clearInterval(timer);
    }
},3000);

3)立即执行的定时器

// nextTick先执行,setImmediate后执行;
// 立即执行,放到一组事件的最后执行,没有清除方式;
process.nextTick(function(){
    console.log(\'响铃\');
});


// 在下一个循环的开头执行
setImmediate(function(){
    console.log(\'响铃\');
});

模块

1、模块:自定义模块、核心模块、第三方模块

2、任意一个文件都是一个模块

3、exports   require    module.exports   __diename     __dirname

4、导出:module.exports.fn=function(){ }

/*
创建两个模块main.js(主模块),circle.js(功能模块);在功能模块中创
建两个函数,传递1个参数,分别获取圆的周长(getLength)和面积(getArea),
导出这两个函数;在主模块中引入功能模块,调用两个方法;*/


//[circle.js]
function getLength(){
    return 2*PI*r;
}

function getArea(){
    return PI*r*r;
}
// 导出
module.exports.getLength=getLength;
module.exports.getArea=getArea;



// [main.js]
// 引入功能模块circle.js,自定义模块格为js结尾,.js可以省略
var circle=require(\'./circle.js\');   
console.log(circle.getLength(2));
console.log(circle.getArea(2));

5、引入文件模块或目录模

 

 

 

 例1:

/*创建模块03_1.js,引入当前目录下的03_2目录模块;
在03_2下创建test.js,导出一个函数fn(打印两个数字
相加),在03_1.js中调用*/

//【03_1.js】
var test=require(\'/03_2/test.js\')
console.log(test.add(2,3));



//【test.js】
function add(a,b){
    return a+b;
}
module.exports.add=add;


// 【package.json】
{"main":"test.js"}

例2:

/*在05目录下创建模块05_1.js,引入不带路径的目录模块05_2,
05_2目录中含有hello.js文件(打印一句话)*/

// 【05目录下05_1.js模块】
require(\'05_2\');


// [node_modules目录下05_2目录,文件名hello.js]
console.log(\'hello\');

// [node_modules目录下05_2目录,创建package.json]
{"main":"hello.js"}

 

包和npm

 npm:node package manage

包:就是一个目录模块,里边包含多个文件,其中有一个文件命名为package,json文件,是包说明文件。

 

核心模块--> nodejs官方提供的模块,可以直接引用,不需要创建

1) 查询字符串模块——quearystring

浏览器向服务器发送请求,传递数据的一种方式

parse()    将查询字符串解析为对象

stringify()    将对象转换为查询字符串

http://www.codeboy.com/product_details.html?lid=5&name=dell

例1:

//[querystring.js]
// 引入查询字符串模块
const querystring=require(\'querystring\');   // 对象     用户引入核心模块
var str=\'lid=5&pname=dell\';
// 获取查询字符串传递的数据
// 将查询字符串解析为对象
var obj=querystring.parse(str);
console.log(obj.lid,obj.dell);

var obj2={
    name:\'tom\',
    age:18,
    sex:1
}
// 将对象转换为查询字符串
var str2=querystring.stringfy(obj2);
console.log(str2);

 例2:

/* 把百度搜索时的查询字符串解析为对象,获取关键词 
ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=电脑& */
const querystring=require(\'querystring\');
var str=\'ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=电脑&\';
var obj=querystring.parse(str);
console.log(obj.wd);

2)url模块

parse()     将url解析为对象

protocol    协议    hostname   主机     port    端口     pathname   文件在服务器上路径    query    查询字符串

例1:

// 引入url模块
const url = require(\'url\'); 
var str=\'http://www.codebody.com:80/list/details.html?lid=5&pname=dell\';
// 将url解析为对象
var obj = url.parse(str)
console.log(obj);

format()      将对象转化为一个url

例1:

var obj={
    protocol:\'http\',
    hostname:\'www.codebody.com\',
    port:8080,
    pathname:\'/course/100037.html\',
    query:{lid:5,pname:\'dell\'}
}
// 将对象转换为url
var str = url.format(obj);
console.log(str);

例2:

// 浏览器请求的url为https://www.tmooc.cn:3000/web/1810.html?sid=10&name=tom,获取url中传递的sid和name值

// 引入查询字符串模块
const querystring=require(\'querystring\'); 
// 引入url模块
const url = require(\'url\');
var str = \'https://www.tmooc.cn:3000/web/1810.html?sid=10&name=tom\';
var obj=parse(str);
// 获取查询字符串
var qs = obj.query;
// 解析查询字符串为对象
var res = querystring(qs);
console.log(res.sid,res.name);

3)文件系统模块——fs

fs.stat(path,callback)/fs.statSync(path)      查看文件的状态,通过回调函数来获取结果。

path     要查看的文件路径

callback     回调函数

    err       如果查看失败的错误信息

    stats    文件状态信息

  isDirectory()   是否为目录

       isFile()    是否为文件

 

对比同步和异步的区别?

  同步会组织后续代码的主席那个,只有方法执行完才能继续执行后边的代码;是通过返回值来获取结果;

  异步不会阻止后续代码的执行,把执行的结果放到整个程序的最后执行;通过回调函数来获取结果;

 

例1:

// 引入fs模块
const fs = require(\'fs\');
// 查看文件状态
fs.stat(\'C:/Users/ecarx/Desktop/ffwdx200.jtl\',(err,stats)=>{
    // err   如果有错误信息,会存储再err中
    // stats   文件的具体状态信息
    console.log(stats);
    console.log(err);
});

例2: 有错误时抛出错误(异步)

// 引入fs模块
const fs = require(\'fs\');
// 查看文件状态
fs.stat(\'C:/Users/ecarx/Desktop/ffwdx200.jtl\',(err,stats)=>{
    // err   如果有错误信息,会存储再err中
    // stats   文件的具体状态信息
    // 如果有错误,抛出错误,阻止程序往后运行
    if(err) throw err;
    // 查看文件是目录形式还是文件形式
    // 查看是否为目录
    console.log(stats.isDirectory());  
    // 查看是否为文件按
    console.log(stats.ifFile());
});
console.log(123); // 不会组组织后续代码执行

例3:使用同步

// 使用同步statSync
var res = fs.statSync(\'C:/Users/ecarx/Desktop/ffwdx200.jtl\')
console.log(res.isDirectory());
console.log(res.isFail());

console.log(123); // 同步方法,会阻止后续代码执行

创建目录:

fs.mkdir(path,callback)/fs.mkdirSync(path)    

path  要创建的目录的路径

callback  回调函数,只有一个参数

      err     如果创建失败的错误信息

 

// 创建目录——异步方法

// 引入fs模块
const fs = require(\'fs\');
fs.mkdir(\'mydir\',(err)=>{
    if(err) throw err;
    console.log(\'目录创建成功\');
});
console.log(123);


// 创建目录——同步方法
// 引入fs模块
const fs = require(\'fs\');
var res = fs.mkdirSync(\'mydir\');
console.log(res);
console.log(123);

删除目录:

fs.rmdir(path,callback)/fs.rmdirSync(path)

path     要删除的目录的路径

callback     回调函数,获取函数的结果

  err    如果删除失败的错误信息

// 删除目录
const fs = require(\'fs\');
// 异步
fs.rmdir(\'mydir\',(err)=>{
    if(err) throw err;
    console.log(\'删除成功\');   
});
console.log(123);

// 同步 
const fs = require(\'fs\');
var res = fs.rmdirSync(\'mydir\');
console.log(res); console.log(
123);

读取目录

fs.readdir(path,callback)/fs.readdirSync(path)

path     要读取的目录的路径

callback     回调函数,获取函数的结果

  files    读取的文件,返回数组

  err    如果读取失败的错误信息

// 读取目录(异步)
const fs = require(\'fs\');
fs.readdir(\'05\',(err,files)=>{

    if(err) throw err;
    // files如果没有错误,读取的文件是一个数组
    console.log(files);
})
console.log(123);


// 读取目录(同步)
const fs = require(\'fs\');
var files = fs.readdirSync(\'05\');
console.log(files);
console.log(123);

例子:组合

// 练习:创建目录hello,读取03_2下的所有文件,删除目录hello

// 引入fs模块
const fs = require(\'fs\');
fs.mkdir(\'hello\',(err)=>{
    if(err) throw err;
    console.log(\'hello目录创建成功\')
});
fs.readdir(\'03_2\',(err,files)={
    if(err) throw err;
    console.log(files);
})
fs.rmdir(\'hello\',(err){
    if(err) throw err;
    console.log(\'删除成功\');
});

创建文件

fs.writeFile(path,data,callback)    写入文件/创建文件

data   要写入的数据

如果文件不存在则创建文件,然后写入,若已存在,则清空内容写入;

 

// 创建文件,每次写入会先清空后写入

// 引入fs模块(异步)
const fs = require(\'fs\');
fs.writeFile(\'data.txt\',\'hello\',(err)=>{
    if(err) throw err;
});

 

例1:

/* 练习:创建目录mydir,在该目录下创建文件1.txt,写入1,创建文件2.txt,写入2,
读取mydir下所有文件;删除mydir整个,过程全部使用同步方法。*/


// 引入fs模块
const fs = require(\'fs\');
var creat = fs.mkdirSync(\'mydir\');
console.log(creat);
var file1 = fs.writeFileSync(\'1.txt\',1);
console.log(file1);
var file2 = fs.writeFileSync(\'2.txt\',2);
console.log(file2);
var all = fs.readdirSync(\'mydir\');
console.log(all);
var rm = fs.rmdirSync(\'mydir\')
console.log(rm);

读取文件(返回的数据是buffer形式)

fs.readFile(path,callback)/fs.readFileSync(path)

追加写入(若文件不存在则创建文件,若文件已存在,则在末尾写入数据)

fs.appendFile(path,data,callback)

fs.appendFileSync(path,data)

 例2:

/* 创建文件user.txt,每次写入一个对象{uid:1,uname:\'tom\',upwd:\'123456\'}*/

// 引入fs模块(异步)
const fs = require(\'fs\');
var user = {uid:1,uname:\'tom\',upwd:\'123456\'};
// 遍历对象获取数据
for(var key in user){
    console.log(key+\'---\'+user[key]);
    fs.appendFileSync(\'user.txt\',user[key]+\' \');

}
// 每次写完数据加换行
fs.appendFileSync(\'user.txt\',\'\\n\');

 

 

以上是关于node.js的主要内容,如果未能解决你的问题,请参考以下文章

vscode代码片段建议bug

从Node.js Stream写入多个文件

Node.js与HTTP响应主体的unicode问题

节点 JS 不提供静态图像

你可能不知道的JavaScript代码片段和技巧(下)

你可能不知道的JavaScript代码片段和技巧(上)