nodejs学习笔记(上)

nodejs学习笔记 (上)

  • 通过学习需要做到的是 了解 前后端是如何进行交互的

  • nodejs也是使用javaScript进行编写的

  • javaScript在不同的运行环境中有不同的作用

    • 在浏览器内核中 javaScript用来实现用户的交互
      • dom操作 bom操作 ajax等等
    • 在浏览器的运行环境中 javaScript不能操作用户的文件 这个不是因为javaScript能力不允许 而是因为浏览器禁止了这类操作, 原因是不安全
  • 而在node终端中运行的javaScript就可以对文件进行操作

环境的配置

Node的安装

  • 安装包安装(不建议) node的更新速度很快, 通常两三个月就会更新一次, 而实际开发中, 经常需要在特定版本的node中运行代码 所以要使用Node的版本管理器来安装Node
  • Node版本管理器 nvm
    • window的nvm 和 苹果系统的nvm不一样 安装方法也不一样

window下常用的命令行操作

  • 切换当前目录(change directory):cd
  • 创建目录(make directory):mkdir
  • 查看当前目录列表(directory):dir
    • 别名:ls(list)
  • 清空当前控制台:cls
    • 别名:clear
  • 删除文件:del
    • 别名:rm

注意:所有别名必须在新版本的 PowerShell (linux系统)中使用

模块化管理 commonjs

前端模块化 : AMD规范 CMD规范 Commonjs
Node采用Commonjs模块规范

具体步骤

  • 定义module
    • 每一个js文件就是一个模块, 有自己的作用域, 其他js文件访问不了该js文件的变量函数
  • 暴露接口
    • CommonJS规定, 每一个模块内部, module变量代表当前模块,它的exprots属性 就是对外的接口. 加载某个模块, 其实就是加载该模块的 module.exports属性, 例如
var test = function() {
     };
module.exports.test = test; // 这里就把test函数暴露出去了
  • 引用接口
    • 如果在模块中需要引用另外一个模块的函数或变量, 那么就用require方法来加载, 例如
var getTest = require('./被引用模块的路径/被引用模块的文件名.js')
getTest.test(); // 这样就可以使用了

模块的分类

  • 模块可以分成三类
  • 内置模块 node自带的模块, 直接引用
  • 第三方模块 由其他的人打包做好的模块 通过npm下载后 引用
  • 自定义模块 自己编写的模块 暴露接口后 引用

###npm 使用入门

官网:https://www.npmjs.com/

安装:无需安装

查看当前版本:

$ npm -v

更新:

$ npm install npm@latest -g

初始化工程

$ npm init

$ npm init --yes 默认配置

安装包

使用npm install会读取package.json文件来安装模块。安装的模块分为两类
dependencies和devDependencies,分别对应生产环境需要的安装包和开发环境需要的安装包。

$ npm install

$ npm install  

$ npm install  --save

$ npm install  --save-dev

更新模块

$ npm update

卸载模块

$ npm uninstall 

$ npm uninstall --save lodash

配置npm源 (推荐使用这个方法)

  • 临时使用, 安装包的时候通过–registry参数即可

    $ npm install express --registry https://registry.npm.taobao.org

  • 全局使用

      $ npm config set registry https://registry.npm.taobao.org
      // 配置后可通过下面方式来验证是否成功
      npm config get registry
      // 或
      npm info express
    
  • cnpm 使用 (不建议使用这个方法)

    	 // 安装cnpm
    	  npm install -g cnpm --registry=https://registry.npm.taobao.org
    
    	  // 使用cnpm安装包
    	  cnpm install express
    

常用的内置模块

node 常用内置api

(1) URL 网址解析
解析URL相关网址信息
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
url.format(urlObject)
url.resolve(from, to)
(2) QueryString 参数处理
querystring.escape(str)
querystring.unescape(str)
querystring.parse(str[, sep[, eq[, options]]])
querystring.stringify(obj[, sep[, eq[, options]]])
(3) HTTP 模块概要
http.createServer([options][, requestListener])
http.get(options[, callback])
简易的爬虫
代理跨域处理
(4) 事件 events 模块
(5) 文件fs模块
打印目录树
(6) Stream 流模块
歌词播放
音乐下载
(8) request 方法

一个简单的爬虫(爬图片的)

const fs = require("fs");  // 引入内置fs文档操作模块
const cheerio = require("cheerio"); // 引入cheerio第三方模块 这个模块用于方便操作爬取来的html页面的元素(可以用JQ语法获取)
const https = require("https");  // 引入https内置发送请求模块
const request = require("request");	// 引入request第三方发送http请求模块

// 需要爬取的网址
let url = "xxxxxx";
https.get(url,function (res) {
      // 用get方法请求页面
    // 安全判断
    const {
     statusCode} = res; // 状态码
    const contentType = res.headers['content-type'];

    console.log(statusCode);
    console.log(contentType);


  let error = null;
  if (statusCode !== 200) {
     
    error = new Error("请求状态错误");
  } else if (!/^text\/html/.test(contentType)) {
      // 我们需要爬取的是html页面
    error = new Error("请求类型错误");
  }
  if (error) {
      // 如果error为真 则说明上方两种情况之一出错
    console.error(error.message); // 打印出错信息
    res.resume(); // 重置缓存
    return false;
  }

    // 数据的处理
    // 设置传输来的html格式 防止乱码
  res.setEncoding('utf8');  // 设置字符集
  let rawData = ``;
  res.on('data', function (chunk) {
     
    // 每次传输的操作
    rawData += chunk;
  });
  res.on('end', () => {
     
    const $ = cheerio.load(rawData);
    getImg($);
  });
}).on('error', (e) => {
     
  console.error(`Got error: ${
       e.message}`);
});

// 内容的处理
function getImg($) {
     
    fs.mkdir("./img01",function (err) {
     
        if(!err) {
     
            $("img").each(function (index,item){
     
                let writeStream = fs.createWriteStream(`./img01/${
       index}.jpg`); // 创建一个可写入的文件
                let src = request($(item).attr("src")); // 获取图片
                src.pipe(writeStream); // 写入图片
            })
        }
    })
    
}

node中的异步操作

  • fs文件操作模块几乎所有操作都有异步和同步两种形式
    • 异步 readFile() 和 同步 readFileSync()
    • 区别:
      • 同步调用会阻塞代码的执行,而异步不会
      • 异步调用会将任务放到任务队列中, 直到任务执行完毕之后才会回调
      • 捕获异常时, 同步的调用必须使用 try catch的方式, 而异步的调用则要用"错误优先",通过回调函数的第一个参数捕获异常 例如:
console.time('sync');
try {
     
  var data = fs.readFileSync(path.join('C:\\Users\\iceStone\\Downloads', 'H.mp4'));
  // console.log(data);
} catch (error) {
     
  throw error;
}
console.timeEnd('sync');

console.time('async');
fs.readFile(path.join('C:\\Users\\iceStone\\Downloads', 'H.mp4'), (error, data) => {
     
  if (error) throw error;
  // console.log(data);
});
console.timeEnd('async');

promise 对象的使用

如果很多的异步操作需要安装顺序来的时候, 就需要回调函数的嵌套, 如果过多的函数嵌套会造成回调地狱, 这样不利于后期代码的维护, 可以使用promise对象来解决这个问题

具体使用步骤

function test1() {
     
    return new Promise(function (resolve, reject) {
     
        //需要的异步操作
        //处理结束后,调用resolve或者reject
        resolve("成功调用resolve"); // 会走then路线
        reject("失败调用reject"); // 会走catch路线
    })
}
function test2() {
     
    同上
}
function test3() {
     
    同上
}
test1()
.then(function (msg){
     
    return test2();
})
.then(function (msg) {
     
    return test3();
})
.catch(function (err) {
     
    // 只需要一个catch来捕获错误
})
// 一般来说有多少个异步操作就有多少个then

你可能感兴趣的:(笔记,node.js)