Node.js平台是在后端运行JavaScript
代码,所以,必须首先在本机安装Node环境。
Node.js是运行在服务区端的JavaScrip
t环境,服务器程序和浏览器程序相比,最大的特点是没有浏览器的安全限制了,而且,服务器程序必须能接收网络请求,读写文件,处理二进制内容,所以,Node.js内置的常用模块就是为了实现基本的服务器功能。这些模块在浏览器环境中是无法被执行的,因为它们的底层代码是用C/C++
在Node.js运行环境中实现的。
npm
npm其实是Node.js的包管理工具(package manager)。
模块
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Node环境中,一个.js文件就称之为一个模块(module)。
最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Node内置的模块和来自第三方的模块。
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。
CommonJS规范
一个模块想要对外暴露变量(函数也是变量),可以用module.exports = variable
;,一个模块要引用其他模块暴露的变量,用const ref = require('module_name')
;就拿到了引用模块的变量。
强烈建议使用module.exports = xxx
的方式来输出模块变量
global
JavaScript有且仅有一个全局对象,在浏览器中,叫window
对象。而在Node.js环境中,也有唯一的全局对象,但不叫window,而叫global
,这个对象的属性和方法也和浏览器环境的window不同。
判断JavaScript执行环境
if (typeof(window) === 'undefined') {
console.log('node.js');
} else {
console.log('browser');
}
基本模块
fs
文件系统模块,负责读写文件。同时提供了异步和同步的方法。
异步读文件 readFile
'use strict'
const fs = require('fs')
fs.readFile('sample.txt', 'utf-8', (err, data) => {
if (err) {
console.log(err)
} else {
console.log(data)
}
})
请注意,sample.txt
文件必须在当前目录下,且文件编码为utf-8
。
异步读取时,传入的回调函数接收两个参数,当正常读取时,err
参数为null
,data
参数为读取到的String
。当读取发生错误时,err参数代表一个错误对象,data
为undefined
。这也是Node.js
标准的回调函数:第一个参数代表错误信息,第二个参数代表结果。
当不传入文件编码时,回调函数的data
参数将返回一个Buffer
对象。
Buffer
对象可以和String
作转换
// Buffer -> String
const text = data.toString('utf-8');
console.log(text);
// String -> Buffer
const buf = Buffer.from(text, 'utf-8');
console.log(buf)
同步读文件 readFileSync
不接收回调函数,函数直接返回结果。
'use strict'
const fs = require('fs')
const data = fs.readFileSync('sample.txt', 'utf-8')
console.log(data)
如果同步读取文件发生错误,则需要用try...catch
捕获该错误:
try {
var data = fs.readFileSync('sample.txt', 'utf-8');
console.log(data)
} catch (err) {
// 出错了
}
写文件 writeFile/writeFileSync
'use strict'
const fs = require('fs')
const data = 'Hello, Node.js'
fs.writeFile('output.txt', data, function (err) {
if (err) {
console.log(err)
} else {
console.log('ok.')
}
})
'use strict'
const fs = require('fs')
const data = 'Hello, Node.js'
fs.writeFileSync('output.txt', data)
stat
如果我们要获取文件大小,创建时间等信息,可以使用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)
// 创建时间, Date对象:
console.log('birth time: ' + stat.birthtime)
// 修改时间, Date对象:
console.log('modified time: ' + stat.mtime)
}
}
})
绝大部分需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码,否则,同步代码在执行时期,服务器将停止响应,因为JavaScript只有一个执行线程。
服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时,可以使用同步代码,因为这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行。
stream
stream
是Node.js提供的又一个仅在服务区端可用的模块,目的是支持“流”这种数据结构。
在Node.js中,流也是一个对象,我们只需要响应流的事件就可以了:data
事件表示流的数据已经可以读取了,end
事件表示这个流已经到末尾了,没有数据可以读取了,error
事件表示出错了。
'use strict'
const fs = require('fs')
const rs = fs.createReadStream('input.txt', 'utf-8')
// 读取流数据
rs.on('data', (chunk) => {
console.log(`data ${chunk}`)
})
// 读取完成
rs.on('end', () => {
console.log('end')
})
// 读取出错
rs.on('error', (err) => {
console.log(`error ${err}`)
})
要以流的形式写入文件,只需要不断调用write()
方法,最后以end()
结束:
const ws = fs.createWriteStream('input.txt', 'utf-8')
ws.write('使用stream写入文本数据')
ws.end()
pipe
一个Readable
流和一个Writable
流串起来后,所有的数据自动从Readable
流进入Writable
流,这种操作叫pipe
。
在Node.js中,Readable流有一个pipe()方法
'use strict'
var fs = require('fs')
var rs = fs.createReadStream('sample.txt')
var ws = fs.createWriteStream('copied.txt')
rs.pipe(ws)
http
Node.js开发的目的就是为了用JavaScript编写Web服务器程序。
const http = require('http')
const hostname = '127.0.0.1'
const port = 3000
const server = http.createServer((req, res) => {
res.writeHead(200)
res.write('Hello World')
res.end()
})
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}`)
})
crypto
crypto模块的目的是为了提供通用的加密和哈希算法。
const crypto = require('crypto')
const hash = crypto.createHash('md5')
// 可任意多次调用update()
hash.update('Hello, world!')
hash.update('Hello, nodejs!')
console.log(hash.digest('hex')) // 7e1977739c748beac0c0fd14fd26a544
node后台运行
node index.js &
查看node进程
ps -ef |grep node