Node.js

Node.js平台是在后端运行JavaScript代码,所以,必须首先在本机安装Node环境。

Node.js是运行在服务区端的JavaScript环境,服务器程序和浏览器程序相比,最大的特点是没有浏览器的安全限制了,而且,服务器程序必须能接收网络请求,读写文件,处理二进制内容,所以,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参数为nulldata参数为读取到的String。当读取发生错误时,err参数代表一个错误对象,dataundefined。这也是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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值