node.js知识点总结

一、当exports对象和module.exports对象指向的不是同一个对象时,以module.exports对象为准。

二、系统模块

// 1. fs.readFile()  读取文件
// 语法格式
fs.readFile('包含文件名的文件路径', ['文件编码'], callback)

// 例子
fs.readFile('./01.helloword.js', 'UTF-8', (err, doc) => {
  // 如果文件读取错误err,是一个对象,包含错误信息
  // 如果文件读取正确,err是空
  // doc是文件读取的结果
  console.log(err)
  console.log(doc)
})



// 2. fs.writeFile()  写入文件内容
// 语法格式
fs.writeFile('包含文件名的文件路径', '要写入的内容', callback)

// 例子
fs.writeFile('./demo.txt', '即将要写入的内容', (error) => {
  // 写入失败
  if (error !== null) return console.log(error)
  // 写入成功
  console.log('写入成功')
});

三、path路径拼接语法

// 语法: 
path.join('路径','路径',...)

// 例子
//  public/upload/avator
const path = require('path')
//  路径拼接
const finalPath = path.join('public', 'upload', 'avator');

四、相对路径和绝对路径

  • 大多数情况下使用绝对路径,因为相对路径有时候相对的是命令行工具的当前工作目录
  • 在读取文件或者设置文件路径时都会选择绝对路径
  • 使用__dirname获取当前文件所在的绝对路径
path.join(__dirname, '05.readfile.js')

 五、第三方模块

1. nodemon是一个命令行工具,用以辅助项目开发(在Node.js中,每次修改文件都要在命令行工具中重新执行该文件,非常繁琐)。

2. nrm:npm下载地址切换工具(npm默认的下载地址在国外,国内下载速度慢)

3. Gulp:基于node平台开发的前端构建工具。将机械化操作编写成任务,想要执行机械化操作时执行一个命令行命令任务就能自动执行了。(用机器代替手工,提高开发效率)

Gulp的功能:

        1) 项目上线,HTML、CSS、JS文件压缩合并

        2) 语法转换(es6,less)

        3) 公共文件抽离

        4) 修改文件浏览器自动刷新

Gulp的方法:

        1) gulp.src()        获取任务要处理的文件

        2) gulp.pipe()        

        2) gulp.dest()        输出文件

        3) gulp.task()        简历gulp任务

        4) gulp.watch()        监控文件的变化

六、package.json文件

项目描文件,记录当前项目信息,例如项目名称、版本、作者、github地址。

七、web服务器

1.创建服务器,get请求

// 用于创建网站服务器的模块
const http = require('http');
// 用于处理url地址
const url = require('url');
// app对象就是网站服务器对象
const app = http.createServer();
// 当客户端有请求的时候
app.on('request', (req,res) => {
  // req.method   获取请求方式
  // req.url    获取请求地址
  // req.headers    获取请求报文信息


  // 响应报文
  res.writeHead(200, {
    'content-type': 'text/html;charset=utf-8'
  })
  console.log(req.url)
  // 1. 要解析的url地址
  // 2. 将查询参数解析成对象形式
  let { query, pathname } = url.parse(req.url, true);
  console.log(query.name)
  if (pathname == '/index' || pathname == '/') {
    res.end('<h2>欢迎来到首页</h2>')
  } else if (pathname == '/list') {
    res.end('<h2>欢迎来到列表页</h2>')
  } else {
    res.end('not found')
  }


  // if (req.method == 'GET') {
  //   res.end('<h2>hello user 欢迎来到首页</h2>')
  //   // res.end('get')
  // } else {
  //   res.end('post')
  // }
});
// 监听端口
app.listen(3000)
console.log('网站服务器启动成功')

2. post请求参数

        1)参数被放置在请求体中进行传输

        2)获取POST参数需要使用data事件和end事件

        3)使用querystring系统模块将参数转换为对象格式

// 用于创建网站服务器的模块
const http = require('http');
// 处理请求参数模块
const querystring = require('querystring');
// app对象就是网站服务器对象
const app = http.createServer();
// 当客户端有请求的时候
app.on('request', (req,res) => {
  // post参数是通过事件的方式接收的
  // data 当请求参数传递的时候触发data事件
  // end 当参数传递完成的时候触发end事件
  let postParms = '';
  req.on('data', (params) => {
    postParms += params;
  });
  req.on('end', () => {
    console.log(querystring.parse(postParms));
  });
  res.end('ok')
});
// 监听端口
app.listen(3000)
console.log('网站服务器启动成功')

3.静态资源,动态资源

const http = require('http');
const app = http.createServer();
const url = require('url');
const path = require('path');
const fs = require('fs');
// 读取文件类型
const mime = require('mime');

app.on('request', (req, res) => {
  // 获取用户请求的路径
  let pathname = url.parse(req.url).pathname;
  pathname = pathname == '/' ? 'index.html' : pathname;
  let realPath = path.join(__dirname, 'public', pathname);
  let type = mime.getType(realPath);
  fs.readFile(realPath, (error, result) => {
    if (error !== null) { 
      res.writeHead(404, {
        'content-type': 'text/html;charset=utf8'
      });
      res.end('文件读取失败')
      return
    }
    res.writeHead(200, {
      'content-type': type
    })
    res.end(result);
  });
});

app.listen(3000)
console.log('服务启动成功')

八、异步编程

1. Promise   解决异步编程得回调地狱

let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (true) {
      resolve({name: '张三'});
    } else {
      reject('失败了');
    }
  }, 2000)
});
promise.then(result => {
  console.log(result)
})
promise.catch(error => {
  console.log(error)
})

2. 异步函数 

异步函数是异步编程语法的终极解决方案,它可以让我们将异步代码携程同步的形式,让代码不再有回调函数嵌套,使代码变得清晰明了。

        anync 关键字

        1)普通函数定义前加async关键字,普通函数变成异步函数

        2)异步函数默认返回promise对象

        3)在异步函数内部使用return关键字进行结果返回,结果会被包裹在promise对象中,return关键字代替了resolve方法

        4)在异步函数内部使用throw关键字抛出程序异常

        5)调用异步函数再链式调用then方法获取异步函数执行结果

        6)调用异步函数再链式调用catch方法获取异步函数执行的错误信息

        await 关键字

        1)await关键字只能出现在异步函数中

        2) await promise, await后面只能写promise对象,写其他类型的API是不可以的

        3)await关键字可以暂停异步函数向下执行,直到promise返回结果

// 1. 普通函数定义的前面加上async关键字,普通函数就变成了异步函数
// 2. 异步函数默认的返回值是promise对象
// 3. 在异步函数内部使用throw关键字进行错误的抛出
// await关键字
// 1. 它只能出现在异步函数中
// 2. await promise 它可以暂停异步函数的执行,等待promise对象返回结果后再向下执行。


async function fn () {
  throw '出错了';
  return 123;
}

fn().then((data) => {
  console.log(data)
}).catch((error) => {
  console.log(error)
})


async function p1 () {
  return 'p1';
}
async function p2 () {
  return 'p2';
}
async function p3 () {
  return 'p3';
}

async function run () {
  let r1 = await p1()
  let r2 = await p2()
  let r3 = await p3()
  console.log(r1)
  console.log(r2)  
  console.log(r3)
}
run()

九、Express编程

express框架提供了方便简洁的路由定义方式。

express框架对获取HTTP请求参数进行了简化处理。

express对模板引擎支持程度高,方便渲染动态HTML页面。

express提供了中间件机制有效控制HTTP请求。

express拥有大量第三方中间件对功能进行扩展

// 引用express框架
const express = require('express');
// 创建网站服务器
const app = express();

app.get('/', (req, res) => {
  // send()
  // 1. send方法内部会检测响应内容的类型
  // 2. send方法会自动设置http状态码
  // 3. send方法会帮助我们自动设置响应的内容类型及编码
  res.send('hello,express');
})

app.get('/list', (req, res) => {
  res.send({name: '张三', age: 23});
})

app.listen(3000);
console.log('服务启动成功')

1. 中间件

中间件应用

        1)路由保护,客户端在访问需要登录的页面是,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登陆的页面。

        2)网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。

        3)自定义404页面。


版权声明:本文为MICHAEL_PRINCE原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。