node.js小结

发布于:2023-01-04 ⋅ 阅读:(777) ⋅ 点赞:(0)

什么是node.js
-node.js是一个基于Chrome v8引擎的javascript 运行环境。Node.js使用了一个事件驱动、非阻塞式 I/O的模型,使其轻量又高效。(由c++语言编写的)Node.js的包管理器npm,成为世界上最大的开放源代码的生态系统。 简单说:编写高性能网络服务器的javascipt工具包(用于js开发服务端程序) 单线程、异步、事件驱动。

node.js是一个Javascript运行环境(runtime)
Node.js 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。
Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。 。
NPM:全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载、安装、上传以及管理已经安装的包。 ,它已经成为了非官方的发布Node模块(包)的标准。
nodejs自身提供了基本的模块,但是开发实际应用过程中仅仅依靠这些基本模块则还需要较多的工作。幸运的是,Nodejs库和框架为我们提供了帮助,让我们减少工作量。但是成百上千的库或者框架管理起来又很麻烦,有了NPM,可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。
常用的指令
dir 列出当前目录下的所有文件
cd 目录名 进入到指定的目录
md 目录名 创建一个文件夹
rd 目录名 删除一个文件夹

环境变量
-windows系统中的变量

进程和线程
进程
-进程负责位程序的运行提供必备的环境
-进程就相当于工厂中的车间
线程
-线程计算机中最小的计算单位,线程负责执行进程中的程序
-线程就相当于工厂中的工人
-单线程

-多线程

Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
解决高并发

模块规范(commonjs 规范)
导出单个方法 module.exports = function random
module.exports = function random(a,b){
return Math.round(Math.random()*(b-a)+a);
}
导入单个方法
let random = require(‘./random’);
console.log(random(2,5));
以对象的形式导出
let add = require(‘./add’);
let reduce = require(‘./reduce’);
module.exports = {
add,
reduce,
}
以对象的形式导入(结构对象)
//此处导入的为一个对象 包含add函数和reduce函数
let math = require(‘./math.js’);
//调用math.add 和 math.reduce
console.log(math.add(1,2));
console.log(math.reduce(1,2));
//解构对象
let {add,reduce} = require(‘./math’);
console.log(add(1,2));
console.log(reduce(1,2));
模块规范2(es6规范)
es6规范(使用export default 和 export )导出
// 对标 module.exports
export default {
a: 10,
b: 20,
};

export let x = 100;
export let y = 500;
impor 导出名 from 导出文件; or impor {x,y } from 导出文件;
import math from “./math.js”; // export default {}
import { x, y } from “./math.js”;
console.log(math);
console.log(x, y);

ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
// CommonJS模块
let { stat, exists, readfile } = require(‘fs’);

// 等同于
let _fs = require(‘fs’);
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;
上面代码的实质是整体加载fs模块(即加载fs的所有方法),生成一个对象(_fs),然后再从这个对象上面读取 3 个方法。这种加载称为“运行时加载”,因为只有运行时才能得到这个对象,导致完全没办法在编译时做“静态优化”。

ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。
// ES6模块
import { stat, exists, readFile } from ‘fs’;
上面代码的实质是从fs模块加载 3 个方法,其他方法不加载。这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。当然,这也导致了没法引用 ES6 模块本身,因为它不是对象。
export default getTypeList;

导出多个方法
function getMovie(){
return new Promise ((resolve)=>{
axios({
url: ‘https://www.1905.com/vod/top/lst/’,
method: “get”
}).then(({data}) => {
let $ = cheerio.load(data);
let o = [];
KaTeX parse error: Expected '}', got 'EOF' at end of input: … title:(v).find(“.pl28”).attr(“title”),
href: ( v ) . f i n d ( " . l i 03 " ) . f i n d ( " a " ) . e q ( 0 ) . a t t r ( " h r e f " ) , a c t o r : (v).find(".li03").find("a").eq(0).attr("href"), actor: (v).find(".li03").find("a").eq(0).attr("href"),actor:(v).find(“.li04 span”).find(“a”).eq(0).attr(“title”)
+“,”+ ( v ) . f i n d ( " . l i 04 s p a n " ) . f i n d ( " a " ) . e q ( 1 ) . a t t r ( " t i t l e " ) + " , " + (v).find(".li04 span").find("a").eq(1).attr("title") +","+ (v).find(".li04span").find("a").eq(1).attr("title")+""+(v).find(“.li04 span”).find(“a”).eq(2).attr(“title”)
+“,”+ ( v ) . f i n d ( " . l i 04 s p a n " ) . f i n d ( " a " ) . e q ( 3 ) . a t t r ( " t i t l e " ) , s c o r e : (v).find(".li04 span").find("a").eq(3).attr("title"), score: (v).find(".li04span").find("a").eq(3).attr("title"),score:(v).find(“.li05 span”).text()
})
})
resolve(o);
})
})
}
function writefile(url,data){
fs.writeFile(url,JSON.stringify(data),err=>{
if(!err){
console.log(“OK!”);
}else{
console.log(err);
}
})
}
export default{
“getMovie”:getMovie,
“writefile”:writefile
}
import x from ‘./module/writefileModule.js’;
let {getMovie,writefile} =x;
getMovie().then(data=>{
writefile(‘…/data/movieList.json’,data);
})
代理服务器

解决跨域
1.使用cors打开服务器所有请求
app.use(cors());
import express from “express”;
// 引入响应模块
import getList from “./modules/getList.js”;
import cors from “cors”;

let app = express();
// 打开当前服务器的所有请求
// 跨域资源共享
app.use(cors());

app.get(“/getList”, getList);

app.listen(8000, (err) => {
if (!err) {
console.log(“启动成功”);
}
});

import express from “express”;

let app = express();

// 指定静态资源目录(放前端的东西)
app.use(express.static(“public”));

app.get(“/getList”, (req, res) => {
res.json([“a”, “b”, “c”]);
});

app.listen(9000);
2.配置代理服务器

import express from “express”;
// 代理模块
import httpProxyMiddleware from “http-proxy-middleware”;
// 拿到创建代理的方法
let proxy = httpProxyMiddleware.createProxyMiddleware;

let app = express();
// 指定静态资源目录
app.use(express.static(“public”));
// 配置代理
// http://locahost:7000/a => https://h5.biyao.com/a
app.use(
proxy({
// 目标服务器地址
target: “http://www.biyao.com”,
changeOrigin: true,
})
);

app.listen(7000);

node 数据库操作
import { createPool } from “mysql”;

let pool = createPool({
host:‘127.0.0.1’,
user:‘root’,
password:“123456”,
database: “2210”
})
// 获取连接对象 找条小船
pool.getConnection((err, connection) => {
// 发送sql语句
connection.query(“select * from goodlist”, (err, data) => {
console.log(data);
// 释放资源
connection.release();
});
});
重置清空id,让id从1开始自动递增
truncate table 表名
JSON-web-token

token 加密与解密(封装)
import jwt from ‘json-web-token’;
//传入一个对象进行加密 并返回token值
let encrypt = (obj) => jwt.encode(‘guess who i am’, obj).value;
//传入token值并进行解密操作 返回一个对象
let decode = (str) => jwt.decode(‘guess who i am’, str, (err, data) => err || data);
token 加密与解密
jwt.decode(‘密钥’,{‘加密内容’},(err,data)=>{})
//{
//error: null,
//value: ‘eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoic2IifQ.07IVQMWdEwAiOuv7wwflEsdNxpWYOqi4ie_WNNTrN3k’
//}
jwt.encode(‘密钥’,‘token’,(err,data)=>{})
//{
// error: null,
// value: { name: ‘sb’ },
// header: { typ: ‘JWT’, alg: ‘HS256’ }
//}

import jwt from ‘json-web-token’;
let a = jwt.encode(‘wssb’, {
name: “sb”
})
//{
//error: null,
//value: ‘eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoic2IifQ.07IVQMWdEwAiOuv7wwflEsdNxpWYOqi4ie_WNNTrN3k’
//}

jwt.decode(‘wssb’,(a.value),(err,data)=>{
console.log(data);
});

let b = jwt.decode(‘wssb’,(a.value));
console.log(b);
//{
// error: null,
// value: { name: ‘sb’ },
// header: { typ: ‘JWT’, alg: ‘HS256’ }
//}