从零单排的nodejs

nodejs使用简要

给个理由

能用javaScript写后台,还需要什么理由.

从安装开始

1. 在windows上我就不多说
2. 在linux上,使用apt-get一类的方式安装之外,还可以通过编译安装.
  1. 确保系统下g++版本在4.6以上,Python版本在2.6以上.
  2. 从[nodejs.org](https://nodejs.org)下载tar.gz后缀的NodeJS最新版源代码包并解压到某个位置.
  
3. 进入解压到的目录,使用以下命令编译和安装.
         $ ./configure
         $ make
         $ sudo make install
4. 开始运行
    打开终端,键入`node`进入命令交互模式,可以输入一条代码后立即执行并显示结果
     ```shell
     $ node
     > console.log('hello world!')
     hello world!
     ```
    当然,一般咱们是先写一个`js`文件,然后在终端的目录下键入`node xx.js`运行

更新及版本选择

1. 可以使用nvm以及n来进行版本管理(简单说说),下面两个用一个就好。
2. n如何使用
$ sudo npm install n -g
$ sudo n stable     //升级node至最新的稳定版
$ sudo n latest     //安装最新版
$ sudo n 6.4.0      //安装指定版本
3. nvm如何使用(nvm不依赖npm)
    1. 通过脚本文件自动安装(apt-get/yum)
    2. 通过源码安装
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ cd ~/.nvm
$ source ~/.nvm/nvm.sh # 将这一行加入到shell配置文件中,根据环境不同,可能是~/.bashrc, ~/.profile, 或 ~/.zshrc
    3. 如何使用
安装某版本的node
$ nvm install 0.10.26 #安装nodejs v0.10.26   
删除某版本的node
$ nvm uninstall 0.10.26
$ nvm uninstall default

模块

当我们需要写稍大点的程序,不可能都放在一个文件里,所以一般都会将代码模块化.
Node.js采用模块化结构,按照[CommonJS规范](http://wiki.commonjs.org/wiki/CommonJS)定义和使用模块。
在`NodeJS`中,一般将代码合理拆分到不同的`js`文件中,每一个文件就是一个模块,而文件路径就是模块名.除了咱们自己写,还可以使用别人写好的模块,那么就得使用一个神器,叫npm(**Node Package Manager**),一般安装node的时候就安装上了npm,我们进入终端输入:
> npm -v
5.4.2

NPM 资料

咱们顺带说说npm,因为nodejs中命令行用的比较多,很多时候就是使用这个npm,说起来呢npm本身也不是很复杂,但是功能很强大,本质上只做一件事,管理模块,无论是下载还是升级,卸载,都可以用npm,甚至还能用npm升级npm
1. 因为服务器的原因,可能速度会很慢,所以换一个源(taobao源)
npm config set registry https://registry.npm.taobao.org
// 配置后可通过下面方式来验证是否成功
npm config get registry
// 或npm info express
2. 安装插件
    1. *本地安装*:就是只能当前目录使用 `npm install <Module  Name>`
        1. 将安装包放在 `./node_modules` 下(运行 npm 命令时所在的目录),如果没有` node_modules` 目录,会在当前执行 `npm` 命令的目录下生成 `node_modules` 目录。
        2. 可以通过 `require()` 来引入本地安装的包。
    2. *全局安装*:任何地方都能使用    `npm install <Modlue Name> -g`
        1. 将安装包放在 `/usr/local` 下或者你 `node` 的安装目录。
        2. 可以直接在命令行里使用。

    tip:如果出现以下错误:`npm err!  Error: connect ECONNREFUSED 127.0.0.1:8087`
解决办法为:`$ npm config set proxy null`

3. 常用命令
npm list / ls           查看所有本地安装的模块
npm ls  -g              查看所有全局安装的模块

npm uninstall <Module Name>   卸载模块
npm update                    更新npm
npm update <Module Name>      更新模块
npm init                初始化生成一个新的`package.json`文件
npm run xxx             执行`package.json`里`scripts`字段,可以用于指定脚本命令

自定义模块

下面是一个最简单的模块,假定新建一个foo.js文件,写入以下内容
// foo.js

module.exports = function(x) {
    console.log(x);
};
上面代码就是一个模块,它通过module.exports变量,对外输出一个方法。

使用模块

*node的核心模块*
http:提供HTTP服务器功能。
url:解析URL。
fs:与文件系统交互。
querystring:解析URL的查询字符串。
child_process:新建子进程。
util:提供一系列实用小工具。
path:处理文件路径。
crypto:提供加密和解密功能,基本上是对OpenSSL的包装。
`require`命令用于指定加载模块,*加载时可以省略脚本文件的后缀名*。
`require`方法的参数是模块文件的名字。它分成两种情况,第一种情况是参数中含有文件路径(比如上例),这时路径是相对于当前脚本所在的目录,第二种情况是参数中不含有文件路径,这时Node到模块的安装目录,去寻找已安装的模块
// index.js

var http = require('http')         //加载默认模块http
var express = require('express');    //加载express模块(得用npm install express)

var m = require('./foo');            //上文的自定义模块

m.print("这是自定义模块");

http协议

Node基础

node全局

*node的全局对象*
global:表示Node所在的全局环境,类似于浏览器的window对象。需要注意的是,如果在浏览器中声明一个全局变量,实际上是声明了一个全局对象的属性,比如var x = 1等同于设置window.x = 1,但是Node不是这样,至少在模块中不是这样(REPL环境的行为与浏览器一致)。在模块文件中,声明var x = 1,该变量不是global对象的属性,global.x等于undefined。这是因为模块的全局变量都是该模块私有的,其他模块无法取到。

process:该对象表示Node所处的当前进程,允许开发者与该进程互动。

console:指向Node内置的console模块,提供命令行环境中的标准输入、标准输出功能。
*node的全局函数*
setTimeout():用于在指定毫秒之后,运行回调函数。实际的调用间隔,还取决于系统因素。间隔的毫秒数在1毫秒到2,147,483,647毫秒(约24.8天)之间。如果超过这个范围,会被自动改为1毫秒。该方法返回一个计时器对象。
clearTimeout():用于终止一个setTimeout方法新建的定时器。
setInterval():用于每隔一定毫秒调用回调函数。由于系统因素,可能无法保证每次调用之间正好间隔指定的毫秒数,但只会多于这个间隔,而不会少于它。指定的毫秒数必须是1到2,147,483,647(大约24.8天)之间的整数,如果超过这个范围,会被自动改为1毫秒。该方法返回一个计时器对象。
clearInterval():终止一个用setInterval方法新建的定时器。
require():用于加载模块。
Buffer():用于操作二进制数据。
*node的全局变量*
__filename:指向当前运行的脚本文件名。
__dirname:指向当前运行的脚本所在的目录。

异常处理

因为nodejs是异步单线程,所以如果中间出错了,就可能会发生整个程序的错误,所以,在nodejs中异常处理对于程序的稳定运行极为重要(其实对任何程序都很重要)。
一般来说,Node有三种方法,传播一个错误。
    1. 使用throw语句抛出一个错误对象,即抛出异常。
    2. 将错误对象传递给回调函数,由回调函数负责发出错误。
    3. 通过EventEmitter接口,发出一个error事件。
最常用的捕获异常的方式,就是使用try…catch结构。但是,这个结构无法捕获异步运行的代码抛出的异常,所以Node只在很少场合才用try/catch语句,比如使用`JSON.parse`解析JSON文本。
*Node采用的方法,是将错误对象作为第一个参数,传入回调函数。*
回调函数的第一个参数就是一个错误对象,这是为了处理异步操作抛出的错误。

参考资料:
nodejs 入门
阮一峰node教程
nodejs 基础教程
七天学会nodejs
Nodejs API 中文文档
Node.js 包教不包会
使用 Express + MongoDB 搭建多人博客

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容