nodejs使用簡(jiǎn)要
給個(gè)理由
能用javaScript寫(xiě)后臺(tái),還需要什么理由.
從安裝開(kāi)始
1. 在windows上我就不多說(shuō)
2. 在linux上,使用apt-get一類(lèi)的方式安裝之外,還可以通過(guò)編譯安裝.
1. 確保系統(tǒng)下g++版本在4.6以上,Python版本在2.6以上.
2. 從[nodejs.org](https://nodejs.org)下載tar.gz后綴的NodeJS最新版源代碼包并解壓到某個(gè)位置.
3. 進(jìn)入解壓到的目錄,使用以下命令編譯和安裝.
$ ./configure
$ make
$ sudo make install
4. 開(kāi)始運(yùn)行
打開(kāi)終端,鍵入`node`進(jìn)入命令交互模式,可以輸入一條代碼后立即執(zhí)行并顯示結(jié)果
```shell
$ node
> console.log('hello world!')
hello world!
```
當(dāng)然,一般咱們是先寫(xiě)一個(gè)`js`文件,然后在終端的目錄下鍵入`node xx.js`運(yùn)行
更新及版本選擇
1. 可以使用nvm以及n來(lái)進(jìn)行版本管理(簡(jiǎn)單說(shuō)說(shuō)),下面兩個(gè)用一個(gè)就好。
2. n如何使用
$ sudo npm install n -g
$ sudo n stable //升級(jí)node至最新的穩(wěn)定版
$ sudo n latest //安裝最新版
$ sudo n 6.4.0 //安裝指定版本
3. nvm如何使用(nvm不依賴(lài)npm)
1. 通過(guò)腳本文件自動(dòng)安裝(apt-get/yum)
2. 通過(guò)源碼安裝
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ cd ~/.nvm
$ source ~/.nvm/nvm.sh # 將這一行加入到shell配置文件中,根據(jù)環(huán)境不同,可能是~/.bashrc, ~/.profile, 或 ~/.zshrc
3. 如何使用
安裝某版本的node
$ nvm install 0.10.26 #安裝nodejs v0.10.26
刪除某版本的node
$ nvm uninstall 0.10.26
$ nvm uninstall default
模塊
當(dāng)我們需要寫(xiě)稍大點(diǎn)的程序,不可能都放在一個(gè)文件里,所以一般都會(huì)將代碼模塊化.
Node.js采用模塊化結(jié)構(gòu),按照[CommonJS規(guī)范](http://wiki.commonjs.org/wiki/CommonJS)定義和使用模塊。
在`NodeJS`中,一般將代碼合理拆分到不同的`js`文件中,每一個(gè)文件就是一個(gè)模塊,而文件路徑就是模塊名.除了咱們自己寫(xiě),還可以使用別人寫(xiě)好的模塊,那么就得使用一個(gè)神器,叫npm(**Node Package Manager**),一般安裝node的時(shí)候就安裝上了npm,我們進(jìn)入終端輸入:
> npm -v
5.4.2
NPM 資料
咱們順帶說(shuō)說(shuō)npm,因?yàn)閚odejs中命令行用的比較多,很多時(shí)候就是使用這個(gè)npm,說(shuō)起來(lái)呢npm本身也不是很復(fù)雜,但是功能很強(qiáng)大,本質(zhì)上只做一件事,管理模塊,無(wú)論是下載還是升級(jí),卸載,都可以用npm,甚至還能用npm升級(jí)npm
1. 因?yàn)榉?wù)器的原因,可能速度會(huì)很慢,所以換一個(gè)源(taobao源)
npm config set registry https://registry.npm.taobao.org
// 配置后可通過(guò)下面方式來(lái)驗(yàn)證是否成功
npm config get registry
// 或npm info express
2. 安裝插件
1. *本地安裝*:就是只能當(dāng)前目錄使用 `npm install <Module Name>`
1. 將安裝包放在 `./node_modules` 下(運(yùn)行 npm 命令時(shí)所在的目錄),如果沒(méi)有` node_modules` 目錄,會(huì)在當(dāng)前執(zhí)行 `npm` 命令的目錄下生成 `node_modules` 目錄。
2. 可以通過(guò) `require()` 來(lái)引入本地安裝的包。
2. *全局安裝*:任何地方都能使用 `npm install <Modlue Name> -g`
1. 將安裝包放在 `/usr/local` 下或者你 `node` 的安裝目錄。
2. 可以直接在命令行里使用。
tip:如果出現(xiàn)以下錯(cuò)誤:`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 初始化生成一個(gè)新的`package.json`文件
npm run xxx 執(zhí)行`package.json`里`scripts`字段,可以用于指定腳本命令
自定義模塊
下面是一個(gè)最簡(jiǎn)單的模塊,假定新建一個(gè)foo.js文件,寫(xiě)入以下內(nèi)容
// foo.js
module.exports = function(x) {
console.log(x);
};
上面代碼就是一個(gè)模塊,它通過(guò)module.exports變量,對(duì)外輸出一個(gè)方法。
使用模塊
*node的核心模塊*
http:提供HTTP服務(wù)器功能。
url:解析URL。
fs:與文件系統(tǒng)交互。
querystring:解析URL的查詢(xún)字符串。
child_process:新建子進(jìn)程。
util:提供一系列實(shí)用小工具。
path:處理文件路徑。
crypto:提供加密和解密功能,基本上是對(duì)OpenSSL的包裝。
`require`命令用于指定加載模塊,*加載時(shí)可以省略腳本文件的后綴名*。
`require`方法的參數(shù)是模塊文件的名字。它分成兩種情況,第一種情況是參數(shù)中含有文件路徑(比如上例),這時(shí)路徑是相對(duì)于當(dāng)前腳本所在的目錄,第二種情況是參數(shù)中不含有文件路徑,這時(shí)Node到模塊的安裝目錄,去尋找已安裝的模塊
// index.js
var http = require('http') //加載默認(rèn)模塊http
var express = require('express'); //加載express模塊(得用npm install express)
var m = require('./foo'); //上文的自定義模塊
m.print("這是自定義模塊");
http協(xié)議
?
Node基礎(chǔ)
node全局
*node的全局對(duì)象*
global:表示Node所在的全局環(huán)境,類(lèi)似于瀏覽器的window對(duì)象。需要注意的是,如果在瀏覽器中聲明一個(gè)全局變量,實(shí)際上是聲明了一個(gè)全局對(duì)象的屬性,比如var x = 1等同于設(shè)置window.x = 1,但是Node不是這樣,至少在模塊中不是這樣(REPL環(huán)境的行為與瀏覽器一致)。在模塊文件中,聲明var x = 1,該變量不是global對(duì)象的屬性,global.x等于undefined。這是因?yàn)槟K的全局變量都是該模塊私有的,其他模塊無(wú)法取到。
process:該對(duì)象表示Node所處的當(dāng)前進(jìn)程,允許開(kāi)發(fā)者與該進(jìn)程互動(dòng)。
console:指向Node內(nèi)置的console模塊,提供命令行環(huán)境中的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出功能。
*node的全局函數(shù)*
setTimeout():用于在指定毫秒之后,運(yùn)行回調(diào)函數(shù)。實(shí)際的調(diào)用間隔,還取決于系統(tǒng)因素。間隔的毫秒數(shù)在1毫秒到2,147,483,647毫秒(約24.8天)之間。如果超過(guò)這個(gè)范圍,會(huì)被自動(dòng)改為1毫秒。該方法返回一個(gè)計(jì)時(shí)器對(duì)象。
clearTimeout():用于終止一個(gè)setTimeout方法新建的定時(shí)器。
setInterval():用于每隔一定毫秒調(diào)用回調(diào)函數(shù)。由于系統(tǒng)因素,可能無(wú)法保證每次調(diào)用之間正好間隔指定的毫秒數(shù),但只會(huì)多于這個(gè)間隔,而不會(huì)少于它。指定的毫秒數(shù)必須是1到2,147,483,647(大約24.8天)之間的整數(shù),如果超過(guò)這個(gè)范圍,會(huì)被自動(dòng)改為1毫秒。該方法返回一個(gè)計(jì)時(shí)器對(duì)象。
clearInterval():終止一個(gè)用setInterval方法新建的定時(shí)器。
require():用于加載模塊。
Buffer():用于操作二進(jìn)制數(shù)據(jù)。
*node的全局變量*
__filename:指向當(dāng)前運(yùn)行的腳本文件名。
__dirname:指向當(dāng)前運(yùn)行的腳本所在的目錄。
異常處理
因?yàn)閚odejs是異步單線(xiàn)程,所以如果中間出錯(cuò)了,就可能會(huì)發(fā)生整個(gè)程序的錯(cuò)誤,所以,在nodejs中異常處理對(duì)于程序的穩(wěn)定運(yùn)行極為重要(其實(shí)對(duì)任何程序都很重要)。
一般來(lái)說(shuō),Node有三種方法,傳播一個(gè)錯(cuò)誤。
1. 使用throw語(yǔ)句拋出一個(gè)錯(cuò)誤對(duì)象,即拋出異常。
2. 將錯(cuò)誤對(duì)象傳遞給回調(diào)函數(shù),由回調(diào)函數(shù)負(fù)責(zé)發(fā)出錯(cuò)誤。
3. 通過(guò)EventEmitter接口,發(fā)出一個(gè)error事件。
最常用的捕獲異常的方式,就是使用try…catch結(jié)構(gòu)。但是,這個(gè)結(jié)構(gòu)無(wú)法捕獲異步運(yùn)行的代碼拋出的異常,所以Node只在很少場(chǎng)合才用try/catch語(yǔ)句,比如使用`JSON.parse`解析JSON文本。
*Node采用的方法,是將錯(cuò)誤對(duì)象作為第一個(gè)參數(shù),傳入回調(diào)函數(shù)。*
回調(diào)函數(shù)的第一個(gè)參數(shù)就是一個(gè)錯(cuò)誤對(duì)象,這是為了處理異步操作拋出的錯(cuò)誤。
參考資料:
nodejs 入門(mén)
阮一峰node教程
nodejs 基礎(chǔ)教程
七天學(xué)會(huì)nodejs
Nodejs API 中文文檔
Node.js 包教不包會(huì)
使用 Express + MongoDB 搭建多人博客