> # 前言
  年底翁狐,有點(diǎn)時(shí)間又官,抽空學(xué)習(xí)下nodejs叶骨,然后順便整理成教程方便后來者搬素。
  本人學(xué)的主要是nodejs--koa2--mongoose的結(jié)合霎箍。
其中nodejs--koa2屬于操控服務(wù)器奇钞,mongoose屬于操控?cái)?shù)據(jù)庫。
現(xiàn)在剛開始寫漂坏,后續(xù)也會(huì)再次對(duì)文章進(jìn)行修正更改景埃。
> # 正題
## 首先為什么想學(xué)nodejs <hr>
  因?yàn)樽鳛橐粋€(gè)前端,如果你只能寫前端的東西顶别,那就太low了谷徙,比如我現(xiàn)在想自己寫一個(gè)微信小程序,前端頁面能很快搞定驯绎,但是后端呢完慧,你就需要求人,求人不如求己剩失,再說nodejs在大公司也都會(huì)用到屈尼,學(xué)習(xí)也沒什么壞處。但是相對(duì)去學(xué)習(xí)java或者python而言拴孤,java和我們掌握的js語言完全是兩種語言脾歧,python安裝起來有比較繁瑣,畢竟我用的是vue演熟,所以安裝nodejs是很正常的事情鞭执,所以學(xué)習(xí)nodejs也是很正常的事,對(duì)吧芒粹。
## node入門 <hr>
  一般來說如果使用了vue-cli的話兄纺,都會(huì)進(jìn)行對(duì)nodejs的全局安裝,所以node安裝這塊我就不說了化漆。
  nodejs簡單來說就是運(yùn)行在服務(wù)端的javascript估脆,是前端開發(fā)人員比較容易進(jìn)入全站的一門入行服務(wù)器和數(shù)據(jù)庫的語言。
  更正確的說获三,nodejs是開發(fā)人員用javascript編寫的一款前端人員開發(fā)后端服務(wù)的框架旁蔼。
  nodejs有很多api,就像我們剛開始學(xué)習(xí)javascript的時(shí)候一樣疙教,我們也有很多不明白并且感到繁瑣棺聊,所以就出現(xiàn)了各種對(duì)nodejs進(jìn)行2次封裝的框架:express,koa贞谓,egg限佩,nestjs等。本章主要講node裸弦,后面會(huì)再提及我所用的框架koa祟同。
**  看到這,如果你是新手理疙,建議你粗略瀏覽下下面的內(nèi)容晕城,對(duì)nodejs的api有個(gè)認(rèn)知概念即可,畢竟nodejs的api還是很多的窖贤,下面只是羅列了常用的砖顷,然后直接跳過去看koa部分**
## node主要api <hr>
### fs(文件系統(tǒng))
  所有文件系統(tǒng)的操作都具有同步和異步,具體使用看情況赃梧,異步是在方法執(zhí)行完畢之后將參數(shù)放到回調(diào)中再進(jìn)行執(zhí)行滤蝠,而同步則在發(fā)生異常時(shí)立即拋出錯(cuò)誤:另外英文:sync是同步的意思
```javascript
const fs = require('fs');
// unlink是刪除文件的方法
// 異步
fs.unlink('/tem/input.txt', (err) => {
if (err) throw err;
console.log('input.txt文件已被刪除');
})
// 同步
try{
fs.unlink('/tem/input.txt');
console.log('input.txt文件已被刪除');
}catch(err) {
throw err;
}
```
  由于使用異步操作,無法保證執(zhí)行的循序:
```javascript
// 由于rename和stat使用的都是異步授嘀,無法保證回調(diào)結(jié)果那個(gè)先獲取到
// 所以可能出現(xiàn)先獲得文件屬性然后改名成功物咳,也可能相反
fs.rename('/tem/input.txt','/tem/rename.txt', err => {
if (err) throw err;
console.log('改名成功');
})
fs.stat('/tem/input.txt', (err, stat) => {
if (err) throw err;
console.log('獲得文件或目錄屬性'+stat)
})
// 正式寫法
// 但這樣就可能陷入到回調(diào)地獄中,所以后續(xù)的開發(fā)koa框架人員引入了es6的語法中async和await
fs.rename('/tem/input.txt','/tem/rename.txt', err => {
if (err) throw err;
console.log('改名成功');
fs.stat('/tem/input.txt', (err, stat) => {
if (err) throw err;
console.log('獲得文件或目錄屬性'+stat)
});
})
```
- **fs.open(path, type, callback):打開文件**
path:是路徑
type:打開方式蹄皱,有r:以讀寫模式打開览闰,有ws:以讀取模式打開,沒有則新建巷折,有a:以追加模式打開焕济,沒有則新建,具體:<a >參考</a>
- **fs.readFile(path, options, callback):讀取文件獲取數(shù)據(jù)**
path:是路徑
options:是配置參數(shù)盔几,可有可無
- **fs.writeFile(file, data, options, callback):寫入數(shù)據(jù)**
file:文件名或文件路徑
data:數(shù)據(jù)晴弃,字符串類型的數(shù)據(jù)
<br>
<br>
<br>
### http (請(qǐng)求)
  在框架中都會(huì)被封裝,用于連接服務(wù)器
<br>
<br>
<br>
### path(路徑)
  主要用于路徑的生成逊拍,轉(zhuǎn)化上鞠,規(guī)范路徑,了解即可
- **path.format(otpions):將配置轉(zhuǎn)為字符串路徑**
```javascript
// `root` 會(huì)被忽略芯丧。
path.format({
? root: '/ignored',
? dir: '/home/user/dir',
? base: 'file.txt'
});
// 返回: '/home/user/dir/file.txt'
```
- **path.resolve([...paths]):解析路徑**
```javascript
path.resolve('/foo/bar', './baz');
// 返回: '/foo/bar/baz'
path.resolve('/foo/bar', '/tmp/file/');
// 返回: '/tmp/file'
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');
// 如果當(dāng)前工作目錄是 /home/myself/node芍阎,
// 則返回 '/home/myself/node/wwwroot/static_files/gif/image.gif'
```
- **path.join():拼接路徑**
```javascript
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// 返回: '/foo/bar/baz/asdf'
// 其中__dirname的值是你node啟動(dòng)的文件所在目錄
path.join('foo', {}, 'bar');
// 拋出 'TypeError: Path must be a string. Received {}'
```
<br>
<br>
<br>