nodejs学习笔记安装和学习注意点
0. 找不到cnpm的一种解决方案 (修改配置文件)
npm config list
npm config set prefix "C:\Program Files\nodejs\node_modules\cnpm" npm config set cache "C:\Program Files\nodejs\node_modules\cnpm_cache" 记得添加环境变量
1, linux安装,这个简单.这个是nodejs.sh文件,可以一句一句执行,也可以整个nodejs.sh文件上传到linux,再执行 chmod u+x nodejs.sh 再执行 ./nodejs.sh 就可以了
#!/bin/bash # Your Answer # filename: nodejs.sh # chmod u+x nodejs.sh # ./nodejs.sh rm -rf /home/node/project mkdir -p /home/node/project cd /home/node/project rm -rf /usr/local/node mkdir -p /usr/local/node cd /usr/local/node # 下载js # wget https://nodejs.org/dist/v14.15.1/node-v14.15.1-linux-x64.tar.xz cp /home/node-v14.15.1-linux-x64.tar.xz /usr/local/node # 下载完后,将其解压 tar xvJf node-v14.15.1-linux-x64.tar.xz # 将解压的node.js目录移动到/usr/local目录下 # 配置node软连接到/bin目录 #check_results=`find . -name "*.[0-9]*"` rm -rf /bin/node ln -s /usr/local/node/node-v14.15.1-linux-x64/bin/node /bin/node # npm 是 Node.js 的包管理和分发工具。它可以让 Node.js 开发者能够更加轻松的共享代码和共用代码片段 # 下载 node 的压缩包中已经包含了 npm , 我们只需要将其软链接到 bin 目录下即可 rm -rf /bin/npm ln -s /usr/local/node/node-v14.15.1-linux-x64/bin/npm /bin/npm # 配置变量环境 # 将 /usr/local/node-v10/bin 目录添加到 $PATH 环境变量中可以方便地使用通过 npm 全局安装的第三方工具 echo 'export PATH=/usr/local/node-v14.15.1-linux-x64/bin:$PATH' >> /etc/profile # 生效环境变量 source /etc/profile # 使用npm 通过npm安装进程管理模块 forever npm install forever -g # 使用淘宝源,淘宝每10min跟新一次,差不多 npm install -g cnpm --registry=https://registry.npm.taobao.org # 如果没有效果,就自己手动加软连接 ln -s /usr/local/node/node-v14.15.1-linux-x64/bin/cnpm /usr/bin/cnpm # 如果npm更新sqlite3出问题,就是cnpm吧 cnpm install sqlite3 ln -s /usr/bin/clear /usr/bin/clc # vue开发环境 npm install -g express npm install -g webpack npm install -g vue npm install -g vue-cli echo ">> nodejs install finished!!!" # 安装apidoc时,意外发现已经安装好了但是不能使用,说找不到命令,可能是软连接没加,自己手动加一个 ## 类似于 ln -s /usr/local/node/node-v14.15.1-linux-x64/bin/apidoc /usr/bin/apidoc ####################################################################################### ############################# 其他笔记 ##################################### ####################################################################################### # 运行测试 # npm run dev # 出现其他不可描述语法错误,可尝试关闭eslint # 在项目根目录下增加vue.config.js文件。 #// vue.config.js #module.exports = { # lintOnSave: false #} # 构建 # npm run build:prod --report ## 抓取查看端口信息 # sudo yum install ngrep # ngrep port 5060 ## 正则 # ngrep -q '^GET .* HTTP/1.[01]' ## 更详细的用法 参考 # man ngrep # 后台启动,将信息输入到日志中的命令 # nohup node server.js & # nohup查看进程id # jobs -l # nohup kiil进程 # kill -9 pid # nohup后台运行时会产生大量日志信息,直接删除程序也不会自己生成,但是可以清空,清空的快捷命令(其他的cp等指令也可以,不过没这个简单) # :>nohup.out # 新建文件 # touch server.js
2. nodejs的回调函数可以实现cpu的最大利用,因此单线程也效率挺高 go语言底层的协程机制挺像的,只是go底层是多个线程处理任务,不是一个 参考菜鸟
https://www.runoob.com/nodejs/nodejs-callback.html
3. nodejs的事件回调绑定,触发,机制,与qt类似,我觉得像是借鉴了qt的信号和槽的思想,new events.EventEmitter();类似于qobject机制
4. 在 Node 应用程序中,执行异步操作的函数将回调函数作为最后一个参数(这个参数是一个函数,这个函数是我们自己定义的回调函数), 回调函数接收错误对象作为第一个参数(这个参数是一个对象err)。 (参照菜鸟)
5. Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js 里面的许多对象都会分发事件:一个 net.Server 对象会在每次有新连接时触发一个事件, 一个 fs.readStream 对象会在文件被打开的时候触发一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
6. EventEmitter 定义了一个特殊的事件 error,它包含了错误的语义,我们在遇到 异常的时候通常会触发 error 事件。
当 error 被触发时,EventEmitter 规定如果没有响 应的监听器,Node.js 会把它当作异常,退出程序并输出错误信息。我们一般要为会触发 error 事件的对象设置监听器,避免遇到错误后整个程序崩溃。
7. 大多数时候我们不会直接使用 EventEmitter,而是在对象中继承它。包括 fs、net、 http 在内的,只要是支持事件响应的核心模块都是 EventEmitter 的子类。
原因有两点:
1. 具有某个实体功能的对象实现事件符合语义, 事件的监听和发生应该是一个对象的方法。
2. JavaScript 的对象机制是基于原型的,支持 部分多重继承,继承 EventEmitter 不会打乱对象原有的继承关系。
8. nodejs中有buffer,可以直接对内存进行操作,通过编码方式进行转换,eg:hex,utf8等
9. nodejs stream(流) 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)。常见的还有文件IO流,管道流,链式流
其中链式流和java中流操作很像.都是将前一个函数的结果可以当做后一个函数的输入,省去了重新写入磁盘这一步,大大节省了IO, eg:
10. nodejs中模块很有意思,模块加载有两种,一种是类似c语言的函数写法,一种是类似c++的类写法(此处用function表示,起名叫对象),模块来源有两个,分别是文件模块(3类)和原生模块,
查询过程是,先查文件模块缓存有没有,
没有查是否是原生模块,
不是则从磁盘读取文件模块,
是原生模块则查原生模块缓存有没有,没有读磁盘
11. nodejs保留了js传递函数这一特点,类似lambda表达式,也类似c语言的直接传递函数名地址,此处传递比c++,c和java简单.以下是匿名函数的用法:
12. nodejs的路由 我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。我们需要的所有数据都会包含在 request 对象中,该对象作为 onRequest() 回调函数的第一个参数传递。但是为了解析这些数据,我们需要额外的 Node.JS 模块,它们分别是 url 和 querystring 模块。
13. JavaScript 中有一个特殊的对象,称为全局对象(Global Object),它及其所有属性都可以在程序的任何地方访问,即全局变量。在浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,所有全局变量(除了 global 本身以外)都是 global 对象的属性。在 Node.js 我们可以直接访问到 global 的属性,而不需要在应用中包含它。
14. global 最根本的作用是作为全局变量的宿主。按照 ECMAScript 的定义,满足以下条 件的变量是全局变量:
- 在最外层定义的变量;
- 全局对象的属性;
- 隐式定义的变量(未定义直接赋值的变量)。
当你定义一个全局变量时,这个变量同时也会成为全局对象的属性,反之亦然。需要注 意的是,在 Node.js 中你不可能在最外层定义变量,因为所有用户代码都是属于当前模块的, 而模块本身不是最外层上下文。
注意: 最好不要使用 var 定义变量以避免引入全局变量,因为全局变量会污染命名空间,提高代码的耦合风险。
15. __filename 表示当前正在执行的脚本的文件名。它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同。 如果在模块中,返回的值是模块文件的路径。
__dirname 表示当前执行脚本所在的目录。
16. 定时器
setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。:setTimeout() 只执行一次指定函数。返回一个代表定时器的句柄值。
clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
function printHello(){ console.log( "Hello, World!"); }
var t = setTimeout(printHello, 2000); // 两秒后执行以上函数
clearTimeout(t); //清除定时器
setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。返回一个代表定时器的句柄值。
可以使用 clearInterval(t) 函数来清除定时器。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
18. console 用于提供控制台标准输出,它是由 Internet Explorer 的 JScript 引擎提供的调试工具.(里面也有个延时函数)
19. process 是一个全局变量,即 global 对象的属性。它用于描述当前Node.js 进程状态的对象,提供了一个与操作系统的简单接口。内容涉及进程线程的很多方面.通常在写本地命令行程序的时候,少不了要 和它打交道。(具体内容,看菜鸟,有点多)
20. nodejs中可以使用util工具进行类之间的关系继承,这种方式建立在函数基础上,util.inherits(constructor, superConstructor) 是一个实现对象间原型继承的函数,这种继承不像其他继承一样必须全盘接受继承,此处我用c++来类比
21. util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出。它至少接受一个参数 object,即要转换的对象。showHidden 是一个可选参数,如果值为 true,将会输出更多隐藏信息。depth 表示最大递归的层数,如果对象很复杂,你可以指定层数以控制输出信息的多 少。如果不指定depth,默认会递归 2 层,指定为 null 表示将不限递归层数完整遍历对象。 如果 colors 值为 true,输出格式将会以 ANSI 颜色编码,通常用于在终端显示更漂亮 的效果。
使用 eg:console.log(util.inspect(obj, true));
23. util.isArray()如果给定的参数 "object" 是一个数组返回 true,否则返回 false。
util.isRegExp()如果给定的参数 "object" 是一个正则表达式返回true,否则返回false。
util.isDate()如果给定的参数 "object" 是一个日期返回true,否则返回false。
24. util.callbackify(original) 将 async
异步函数(或者一个返回值为 Promise
的函数)转换成遵循异常优先的回调风格的函数,例如将 (err, value) => ...
回调作为最后一个参数。 在回调函数中,第一个参数为拒绝的原因(如果 Promise
解决,则为 null
),第二个参数则是解决的值。
25. Node.js 提供一组标准的文件操作API,包含同步异步,读取,写入,创建文件,删除文件,截取文件等等
26. get请求的获取和解析
27. POST 请求的内容全部的都在请求体中,http.ServerRequest 并没有一个属性内容为请求体,原因是等待请求体传输可能是一件耗时的工作。
比如上传文件,而很多时候我们可能并不需要理会请求体的内容,恶意的POST请求会大大消耗服务器的资源,所以 node.js 默认是不会解析请求体的,当你需要的时候,需要手动来做。
28. Node.js os 模块提供了一些基本的系统操作函数。包含查询文件,cpu,系统,当前时间(秒为单位),内存,网络接口
29. Node.js path 模块提供了一些用于处理文件路径的小工具,包含路径衔接,转换判断等,(这样岂不是可以通过web知道别人电脑里面的文件了吗)
30. Node.js Net 模块提供了一些用于底层的网络通信的小工具,包含了创建服务器/客户端的方法,包含了socket和client的创建方法,链接方法,可以创建一个小型的服务器,主要有socket和server两个类
31. Node.js DNS 模块用于解析域名。
32. Node.js Domain(域) 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常。domain模块,把处理多个不同的IO的操作作为一个组。注册事件和回调到domain,当发生一个错误事件或抛出一个错误时,domain对象会被通知,不会丢失上下文环境,也不导致程序错误立即退出,(domain其实就是划分了一块地方,这块地方domain管理,如果对象没有错误处理机制,有问题交给domain,如果对象自己有处理机制就不交给domain了)
Domain 模块可分为隐式绑定和显式绑定:
-
-
- 隐式绑定: 把在domain上下文中定义的变量,自动绑定到domain对象
- 显式绑定: 把不是在domain上下文中定义的变量,以代码的方式绑定到domain对象
-
33. nodejs提供了http模块,用于创建web服务器,也可以用来搭建客户端
34. Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。
Express 框架核心特性:
-
-
-
可以设置中间件来响应 HTTP 请求。
-
定义了路由表用于执行不同的 HTTP 请求动作。
-
可以通过向模板传递参数来动态渲染 HTML 页面。
-
-
35. express请求响应数据的处理主要是request和response,网页地址路由的处理主要有get和post两种形式. Express 提供了内置的中间件 express.static 来设置静态文件如:图片, CSS, JavaScript 等。
app.use('/mypublic', express.static('public'));
// 可以通过 http://127.0.0.1/mypublic/fly.png 访问 public/fly.png
36. nodejs修改html会直接体现在下次请求中,不用重启服务器
37. REST即表述性状态传递,是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是RESTful。需要注意的是,REST是设计风格而不是标准。REST通常基于使用HTTP,URI,和XML(标准通用标记语言下的一个子集)以及HTML(标准通用标记语言下的一个应用)这些现有的广泛流行的协议和标准。REST 通常使用 JSON 数据格式。(再简单点就是对表的增删改查) 基于 REST 架构的 Web Services 即是 RESTful。
38. nodejs是单线程生物,想要多开,可以考虑多进程,每个子进程总是带有三个流对象:child.stdin, child.stdout 和child.stderr。他们可能会共享父进程的 stdio 流,或者也可以是独立的被导流的流对象。主要有三个方法exec spawn fork
39. 进程意外死亡的原因之一是, 在 stdout 或 stderr 中允许存在的最大缓冲(二进制),如果超出那么子进程将会被杀死 (默认: 200*1024)通过exec中的option可以设置
40. JXcore 是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。(具体再研究)
41. nodejs可以连接数据库,egmysql或者MongoDB,但是如果是单体应用,完全可以考虑,但是对于高并发??????还是算了吧,c++或者java更靠谱
42. 偶然间想到现在的单片机就是一个核心再工作,也可以处理复杂任务,后期可以尝试下,参考单片机中断等级,寄存器等原理,设置一个多线程模型(或者多进程单线程模型)
43. nodejs里面因为是函数主导,因此完全可以借助property属性,制作c++一类的面向对象一类的特征,只不过,这个类是一个json格式的字典罢了,里面的函数,变量啥的都可以用键值对表示
44. nodejs中有个.then,作用是把前一个函数的输出结果当作下一步的输入,进行处理,如果有需要的话,后面可以跟多个.then,这种模式,可以减少磁盘IO,加快运行,在类似做数据分析的时候有大用处。
45. js中的promise可以理解为流处理的承载对象, 参考 https://blog.csdn.net/qq_36453032/article/details/73251134
1. 我觉得嘛,可以尝试这个样子的 new Promise(function(resolve,reject){ }.then(onFulfilled, onRejected){ }.catch(onRejected)
{ }.then(onFulfilled, onRejected){ }.catch(onRejected)
{ }
//