NODE March 18, 2019

Node学习(一) --NodeJs简介

Words count 4.7k Reading time 4 mins. Read count 0

NodeJs简介

  • 简单的说Node.js就是运行在服务端的Javascript
  • Node.js是一个基于ChromeV8引擎的Javascript的执行环境
  • Node.js使用了一个事件驱动,非阻塞式I/O的模型,使其轻量有高效

NodeJs的应用环境

由于Nodejs目前还不够成熟,因此一般不会用作独立开发,它的主要用途如下

中间层

通常在开发应用时,出于安全考虑,后端的主服务器都不会直接暴露给客户端,两端之间通常需要有一个中间层进行通信。

这样做的好处是,如果中间层出现问题,不会影响后端的主服务器。另外,中间层可以做缓存,或者实现一些业务逻辑,起到降低主服务器复杂度,提高性能的作用。

中间层也可以像CDN一样在各处部署,以提高用户的访问效率。

小型服务

可以实现一些小型应用,或某个功能模块。

工具类

工具类 Nodejs可以用来开发一些实用工具,如Webpack、Gulp等等。

Nodejs的优势

  • Nodejs的语法与前台JavaScript相同,因此便于前端开发入手

  • 性能高

  • 利于与前端代码结合,例如在做同样一个数据校验时,前后台代码可以共用,不需要单独开发。

Nodejs的卸载

当需要升级Nodejs时,建议先完全卸载旧版本,特别是全局已下载的依赖,否则有小概率会出现更新版本后,新安装依赖时报错。

完整卸载步骤:
通过系统自带卸载工具,卸载Nodejs,之后最好将Nodejs安装目录整个删除。
手动删除安装目录,如C:\Program Files\nodejs目录下的node_modules文件夹。
找到用户目录,如C:\Users\你的用户名,其中如果有node_modules文件夹,则一起删除。

启动一个Nodejs服务器

我们可以新建一个server.js文件,在命令行通过node server.js命令,就可以运行一个服务器,在浏览器访问中访问http://127.0.0.1:3000/,就可以看到Hello World。

// 引入Nodejs自带的http模块
const http = require('http');
// 引入Nodejs自带的child_process模块
const childProcess = require('child_process');

const hostname = '127.0.0.1'; // 本机地址
const port = 3000; // 端口

// 创建一个服务器
const server = http.createServer((req, res) => {
  res.statusCode = 200; // 设置响应状态码
  res.setHeader('Content-Type', 'text/plain'); // 设置响应头
  res.end('Hello World\n'); // 向前台输出内容
});

// 开启监听
server.listen(port, hostname, () => {
  // 在命令行打印运行结果
  console.log(`Server running at http://${hostname}:${port}/`);
  // 使用默认浏览器打开地址
  childProcess.exec(`start http://${hostname}:${port}/`);
});

response.write

我们使用了http.createServer创建一个服务器,在它的回调函数中,会传入2个参数,分别为request(请求对象)和response(响应对象)。

通常使用response.write方法向前端返回数据,该方法可调用多次,返回的数据会被拼接到一起。

需要注意的是,必须调用response.end方法结束请求,否则前端会一直处于等待状态,response.end方法也可以用来向前端返回数据。

const server = http.createServer((request, response) => {
  response.write('a')
  response.write('b')
  response.write('c')
  response.end('d')
})

File System

File System是Nodejs中用来操作文件的库,可以通过const fs = require('fs')引用。

常用的方法有异步文件读取fs.readFile、异步文件写入fs.writeFile、同步文件读取fs.readFileSync、同步文件写入fs.writeFileSync。由于同步操作可能会造成阻塞,通常建议使用异步操作避免该问题。

fs.writeFile

fs.writeFile可向文件写入信息,若文件不存在会自动创建。

fs.writeFile('./test.txt', 'test', (error) => {
  if (error) {
    console.log('文件写入失败', error)
  } else {
    console.log('文件写入成功')
  }
})

fs.writeFile的主要参数:

第一个参数为写入的文件路径
第二个参数为写入内容(可为<string> | | |
第三个参数为回调函数,传入数据为error对象,其为null时表示成功。

fs.readFile

fs.readFile用来读取文件。

fs.readFile('./test.txt', (error, data) => {
  if (error) {
    console.log('文件读取失败', error)
  } else {
    // 此处因确定读取到的数据是字符串,可以直接用toString方法将Buffer转为字符串。
    // 若是需要传输给浏览器可以直接用Buffer,机器之间通信是直接用Buffer数据。
    console.log('文件读取成功', data.toString())
  }
})

fs.readFile主要参数:
第一个参数为读取的文件路径
第二个参数为回调函数。回调函数传入第一个参数为error对象,其为null时表示成功,第二个为数据,可为<string> | <Buffer>

0%