通过学习需要做到的是 了解 前后端是如何进行交互的
nodejs也是使用javaScript进行编写的
javaScript在不同的运行环境中有不同的作用
而在node终端中运行的javaScript就可以对文件进行操作
注意:所有别名必须在新版本的 PowerShell (linux系统)中使用
前端模块化 : AMD规范 CMD规范 Commonjs
Node采用Commonjs模块规范
var test = function() {
};
module.exports.test = test; // 这里就把test函数暴露出去了
var getTest = require('./被引用模块的路径/被引用模块的文件名.js')
getTest.test(); // 这样就可以使用了
###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); // 写入图片
})
}
})
}
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对象来解决这个问题
具体使用步骤
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