文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

nodejs有什么作用

2024-04-02 19:55

关注

这篇文章主要为大家展示了“nodejs有什么作用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“nodejs有什么作用”这篇文章吧。

一、概览
1、html可以在浏览器直接打开运行,是因为浏览器是html文件的解析器
而js文件不能在浏览器直接运行,是因为浏览器不支持解析js文件,需要有一个解析器来解析js文件
可以下载安装nodejs解析器,并且里面自带了npm,通过node.exe可以直接运行js文件,是通过命令行的形式运行的
要运行某个js文件,直接node + 要运行的js文件名称或者直接是js代码,按回车即可

js操作的是浏览器,node操作的是电脑系统、文件等等

2、编辑器也可以直接运行,推荐使用webstorm

3、在Ecmascript部分,node和js其实是一样的,比如数据类型的定义、语法结构、内置对象
在js中的顶层对象:window
在node中的顶层对象:global,没有window这个概念

二、模块
es6通过import export来进行模块化
nodejs通过require来进行模块化
html通过script标签来引入js文件
1、在nodeJs里面,一个js文件就是一个模块,每个模块都有自己的作用域,
我们使用var声明的变量,不是全局的,而是属于当前模块下的
比如:1.js
var a  = 100;
console.log(a);  //100
console.log(global.a);  //undefined  ,不是全局下面的变量
global.a = 200;
console.log(a);  //100 仍然是开始定义的100
console.log(global.a);  //这时候才是200

2、filename:表示当前文件的绝对路径
dirname:表示当前文件所在目录的绝对路径
它们并非全局的,而是模块作用域下的
所以global.filename是访问不到的,返回undefined
console.log(
filename); //E:\webstorm文件夹\index.js
console.log(__dirname);  //E:\webstorm文件夹

3、模块路径
require();  //可以是绝对路径、相对路径
不能直接是require("1.js")这种不带./的,这种加载方式,会加载node中的核心模块,或者是node_modules里面的慕课

4、查找文件:
首先按照加载的模块的文件名进行查找;
如果没有找到,则会在模块文件名称后面自动加上.js的后缀,然后进行查找;
如果还没有找到,则会在模块文件名称后面自动加上.json的后缀,然后进行查找;
如果还没有找到,则会在模块文件名称后面自动加上.node的后缀,然后进行查找;
如果还没有找到,就会报错。

5、
在一个模块中,通过var定义的变量,其作用域范围是当前模块,外部不能够直接访问到;
如果我们想一个模块能够访问另一个模块中定义的变量,可以通过:

6、在模块作用域下,还有一个内置的模块对象,exports,它其实就是module.exports
所以:
module.exports.name = a;  可以写成 exports.name = a;
【注意】:不要这样操作
module.exports = [1,2,3]
也不要:exports = [1,2,3],只是追加属性,不要修改

三、global对象  全局对象
局部:
filename
dirname
全局:
日期对象  var d = new Date()
数组 var arr = new Array(1,2,3)
定时器

三-1、process对象(进程对象)——全局对象
process === global.process  //true
可以在任何地方都能访问到,通过这个对象提供的属性和方法,使我们可以对当前运行的程序的进程进行访问和控制
1、process.argv
console.log(process.argv);  // [ 'D:\Program Files\nodejs\node.exe', 'E:\webstorm文件夹\2.js' ]
第一个是解析器,第二个是js文件
如果带上参数,那么返回的数组里面就会包含你运行时带入的参数
举例:  node process.argv a=1 // [ 'D:\Program Files\nodejs\node.exe', 'E:\webstorm文件夹\2.js','a=1' ]
2、process.execPath
开启当前进程的这个可执行文件的绝对路径
3、env
返回用户环境信息
4、version
返回node版本信息
5、versions
返回node以及node依赖包版本信息
6、pid
返回当前进程的pid  进程是node.exe
7、title
返回当前进程的显示名称(Getters/Setters)
8、arch
返回当前CPU处理器架构 arm/ia32/x64
9、platform
返回当前操作平台
10、cwd()
返回当前进程的工作目录
11、chdir(directory)
改变当前进程的工作目录
12、memoryUsage()
返回node进程的内存使用情况,单位是byte
12、exit(code)
退出
13、kill(pid)
向进程发送信息
14、IO
a、stdin、stdout:标准输入输出流(IO)
标准输入设备:向计算机输入数据和信息的设备,是计算机与用户或其他设备通信的桥梁。
例如:鼠标、键盘、摄像头等等
标准输出设备:是计算机硬件系统的终端设备,把计算机数据或信息以数字、字符、图像、声音等形式表现出来。例如:显示器、打印等等
stdin、stdout提供了操作输入数据和输出数据的方法,我们也通常称为IO操作
stdin:标准输入流
stdout:标准输出流
console.log(...)  === process.stdout.write(...);

b、默认情况下,输入流是关闭的,要监听处理输入流数据,首先要开启输入流

//开启
process.stdin.resume();
监听用户的输入数据,输入完成按下回车
process.stdin.on('data',function(chunk){
    console.log('用户输入了:'+chunk);
})

会一直监听,用户输入完成按下回车显示数据,再按下仍然会显示第二次输入的数据

四、Buffer类:类似数组
1、定义:一个用于更好的操作二进制数据的类
我们在操作文件或者网络数据的时候,其实操作的就是二进制数据流;Node为我们提供了一个更加方便的去操作这种数据流的类Buffer,他是一个全局的类,global.Buffer === buffer

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。

let bf2 = Buffer.from('miaov');  //bf2.length 5  返回的是字节数,不是字符串长度
let bf3 = Buffer.from('妙味');  //bf3.length  6  一个汉字占据3个字节

2、Buffer类方法

五、文件系统模块 File System
1、该模块是核心模块,需要使用require导入后使用:let fs = require('fs');
2、该模块提供了操作文件的一些API

*通过文件标识fd,向指定的文件中写入buffer
fs.write(fd,buffer,offset,length,[position],callback)
同步版本:fs.writeSync(fd,buffer,offset,length,[position])
fd:通过open方法成功打开一个文件返回的编号
buffer:要写入到文件的数据
offset:从buffer对象中第几位开始写入数据,默认是0
length: 要写入的buffer数据的长度
position:向指定的文件的第几位开始写入buffer数据,默认是0,即从头开始写入数据,如果开头已经有数据,那么新的数据会覆盖原始数据
callback:接受三个参数,err错误信息、length写入数据的buffer对象的长度;newBf:写入数据的buffer对象

*通过文件标识fd,把data写入到文档中,如果data不是buffer对象的实例,则会把值强制转换成为一个字符串
fs.write(fd,data,[position],[encoding],callback)
同步版本:fs.writeSync(fd,data,[position],[encoding])
data:直接是一个字符串,此时不再从第几位写入了,而是全部写入到文件里,所以没有offset参数

六、更好用的文件系统方法
1、fs.writeFile(filename,data,[options],callback)
异步的将数据写入一个文件,如果文件不存在就新建,如果文件原先存在,则会被替换;data可以是一个string,也可以是一个原生buffer
同步版本:fs.writeFileSync(filename,data,[options])

2、fs.appendFile(filename,data,[options],callback)
异步的将数据添加到一个文件的尾部,如果文件不存在就新建,如果文件原先存在,则会将数据追加到文件的尾部;data可以是一个string,也可以是一个原生buffer
同步版本:fs.appendFileSync(filename,data,[options])

3、fs.readFile(filename,[options],callabck)
异步读取一个文件的全部内容
同步版本:fs.readFileSync(filename,[options])

4、fs.exists(path,callback)
检查指定路径的文件或者目录是否存在
同步版本:fs.existsSync(path)

5、fs.unlink(path,callback)
删除一个文件
同步版本:fs.unlink(path)

let fs = require('fs');
let filename = '2.txt';
//异步
if(fs.exists(filename,(err)=>{
    if(!err){
        fs.writeFile(filename,'hello',(err)=>{
            if(err){
                console.log("文件创建失败")
            }else{
                console.log("文件创建成功")
            }
        })
    }else{
        fs.appendFile(filename,'-world',(err)=>{
            if(err){
                console.log('文件追加失败')
            }else{
                console.log('文件追加成功')
            }
        })
    }
}));
//同步
if(!fs.existsSync(filename)){
    console.log('文件创建成功');
    fs.writeFileSync(filename,'hello')
}else{
    console.log('文件追加成功');
    fs.appendFileSync(filename,'-world')
}

6、fs.rename(oldPath,newPath,callback)
重命名
同步版本:fs.renameSync(oldPath,newPath)

7、fs.stat(path,callback)
读取文件信息的状态,不是文件内部的内容,返回值是一个json,包括文件类型、文件日期、文件大小等等
mode=33206表示该文件是文件类型,mode=16822表示该文件是文件夹
同步版本:fs.statSync(path)

8、fs.watch(filename,[options],[listener])  
观察指定路径的改变,filename可以是文件或者目录
//listener是一个监听器,回调函数,有2个参数:事件event和被监听文件的名称filename

9、fs.mkdir(path,[mode],callback)  //mode模式,是只读还是读写模式
创建文件夹
同步版本:fs.mkdirSync(path,[mode])

10、fs.readdir(path,callback)
读取文件夹
同步版本:fs.readdirSync(path)
回调函数包括2个参数,err错误信息和当前文件夹下面所有的文件和文件夹信息fileList

11、fs.rmdir(path,callback)
删除文件夹
同步版本:fs.rmdirSync(path)

七、使用node进行web开发
1、用户上网流程
用户输入https://www.baidu.com/
通过浏览器发送https请求(类似于打电话拨号),请求baidu.com,这个域名可以转换为ip地址
通过ip定位,到网络中指定的一台机器上,然后该机器会接收到该用户发送过来的请求,然后对该请求进行处理,返回对应的内容

简言之:
用户通过浏览器发送一个http请求到指定的服务器
服务器接收到该请求,对该请求进行分析和处理
服务器处理完成之后,返回对应的数据到用户机器
浏览器接受到服务器返回的数据,并根据接收到的数据进行分析和处理

web开发:就是两台机器之间的数据交互,客户端与服务端的交互
由客户端发送一个http请求到指定的服务端 ——> 服务端接收并处理请求 ——> 返回数据到客户端,类比迅雷下载
http协议:

要进行web开发,首先就必须处理关于服务端接收请求的这一过程,所以要搭建服务器,该服务器可以接收来自任何客户端的链接和请求,然后进行对应处理

2、http模块
let http = require('http');
使用该模块可以进行服务器的搭建
nodejs有什么作用
nodejs有什么作用

nodejs有什么作用

server.listen();  //如果不传参数,默认系统会自动分配端口号,但是不建议,要主动设置端口号及主机名

res.writeHead( 200,'',{  //200,默认返回ok
content-type : 'text/html;charset=utf-8'  //会将返回信息当成html输出到页面,html标签起作用
content-type : 'text/plain'  //会将返回信息当成文本文件输出到页面,html标签不起作用
} )


//加载一个http模块
let http = require('http');
//通过http模块下的createServer创建并返回一个web服务器对象
let server = http.createServer();
server.on('error',(err)=>{
    console.log(err)
})
server.on('listening',()=>{
    console.log('linstening...')
})
server.on('request',(req,res)=>{  //req是客户端发送的数据,res是服务端返回的数据
    console.log('有客户端请求了')
    //console.log(req);  //req里面有请求头、域名后面附带的路径信息/a/index.html、method方式
    //console.log(res);  //res里面包括response正文信息(即网页上显示的内容)以及正文之外的一些信息,比如返回头信息(网页上不可见)
    res.writeHead('200','',{
        'content-type':'text/html;charset=utf-8'
    })
    // res.write('<h2>hello</h2>');
    // res.end();
    //可以合并为一步
    res.end('<h2>hello</h2>');
})
server.listen(8080,'localhost');

3、url模块
nodejs有什么作用

let url = require('url');
url.parse();  //专门用于解析url路径,返回json格式数据

4、使用querystring模块方法对get和post提交的数据进行处理
nodejs有什么作用

let qs = require('querystring');
get方式发送数据
qs.parse('foo=bar&abc=xyz&abc=123');  //{foo: 'bar',abc: ['xyz', '123']}

post方式发送数据

let http = require('http');
let url = require('url');
let fs = require('fs');
let qs = require('querystring');
let server = http.createServer();
let filename = __dirname + '/html/';
server.on('error',(err)=>{
    console.log(err)
})
server.on('listening',()=>{
    console.log('listening')
})
server.on('request',(req,res)=>{
    var urlStr = url.parse( req.url );  //返回一个对象,里面的pathname属性和req.url一样
    switch (urlStr.pathname) {
        case '/':
            getData(filename+'index.html',req,res);
            break;
        case '/user':
            getData(filename+'user.html',req,res);
            break;
        case '/login':
            getData(filename+'login.html',req,res);
            break;
        case '/login/check':
            
            if(req.method.toUpperCase() === 'POST'){
                let str = '';
                req.on('data',(chunk)=>{
                    str += chunk;
                })
                req.on('end',()=>{
                    console.log(str);  //username=13795232495&password=111
                    console.log(qs.parse(str));  //[Object: null prototype] { username: '13795232495', password: '111' }
                })
            }
            break;
        default:
            break;
    }
})
function getData(filename,req,res) {
    fs.readFile(filename,(err,data)=>{
        //console.log(data.toString());  //输出页面内的全部标签内容
        if(err){
            res.writeHead(404,'',{
                'content-type':'text/html;charset=utf8'
            })
            res.end('<h2>404</h2>')
        }else{
            res.writeHead(200,'',{
                'content-type':'text/html;charset=utf8'
            })
            res.end(data)
        }
    })
}
server.listen(8082,'localhost');

//加载一个http模块
let http = require('http');
let url = require('url');
//通过http模块下的createServer创建并返回一个web服务器对象
let server = http.createServer();
server.on('error',(err)=>{
    console.log(err)
})
server.on('listening',()=>{
    console.log('linstening...')
})
server.on('request',(req,res)=>{  //req是客户端发送的数据,res是服务端返回的数据
    console.log('有客户端请求了')
    console.log(req.url);  //req里面有请求头、域名后面附带的路径信息/a/index.html、method方式
    //console.log(res);  //res里面包括response正文信息(即网页上显示的内容)以及正文之外的一些信息,比如返回头信息(网页上不可见)
    switch (req.url) {
        case '/':
            res.writeHead(200,'',{
                'content-type':'text/html;charset=utf-8'
            })
            res.end('<h2>这是首页</h2>');
            break;
        case '/user':
            res.writeHead(200,'',{
                'content-type':'text/html;charset=utf-8'
            })
            res.end('<h2>这是用户页</h2>');
            break;
        default:
            res.writeHead(404,'',{
                'content-type':'text/html;charset=utf-8'
            })
            res.end('<h2>404</h2>');
            break;
    }

    // res.write('<h2>hello</h2>');
    // res.end();
    //可以合并为一步
    //res.end('<h2>hello</h2>')

})
server.listen(8080,'localhost');

【注意】
1、所谓异步,就是执行成功了之后会执行一个回调函数,下面的代码会继续执行,即使报错了也不妨碍下面代码的执行;同步,就是成功了就继续执行下面的代码,报错了就卡在这儿了,下面的代码也就执行不了了。
2、所谓的参数filename,包括文件的名称和路径(如果有路径的话),比如在task文件夹下创建index.html
那么filename='task/index.html'
要包括文件的名称,不能仅仅是一个空路径,'task/'

以上是“nodejs有什么作用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯