> # 前言
  年底,有点时间,抽空学习下nodejs,然后顺便整理成教程方便后来者。
  本人学的主要是nodejs--koa2--mongoose的结合。
其中nodejs--koa2属于操控服务器,mongoose属于操控数据库。
现在刚开始写,后续也会再次对文章进行修正更改。
> # 正题
## 首先为什么想学nodejs <hr>
  因为作为一个前端,如果你只能写前端的东西,那就太low了,比如我现在想自己写一个微信小程序,前端页面能很快搞定,但是后端呢,你就需要求人,求人不如求己,再说nodejs在大公司也都会用到,学习也没什么坏处。但是相对去学习java或者python而言,java和我们掌握的js语言完全是两种语言,python安装起来有比较繁琐,毕竟我用的是vue,所以安装nodejs是很正常的事情,所以学习nodejs也是很正常的事,对吧。
## node入门 <hr>
  一般来说如果使用了vue-cli的话,都会进行对nodejs的全局安装,所以node安装这块我就不说了。
  nodejs简单来说就是运行在服务端的javascript,是前端开发人员比较容易进入全站的一门入行服务器和数据库的语言。
  更正确的说,nodejs是开发人员用javascript编写的一款前端人员开发后端服务的框架。
  nodejs有很多api,就像我们刚开始学习javascript的时候一样,我们也有很多不明白并且感到繁琐,所以就出现了各种对nodejs进行2次封装的框架:express,koa,egg,nestjs等。本章主要讲node,后面会再提及我所用的框架koa。
**  看到这,如果你是新手,建议你粗略浏览下下面的内容,对nodejs的api有个认知概念即可,毕竟nodejs的api还是很多的,下面只是罗列了常用的,然后直接跳过去看koa部分**
## node主要api <hr>
### fs(文件系统)
  所有文件系统的操作都具有同步和异步,具体使用看情况,异步是在方法执行完毕之后将参数放到回调中再进行执行,而同步则在发生异常时立即抛出错误:另外英文: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;
}
```
  由于使用异步操作,无法保证执行的循序:
```javascript
// 由于rename和stat使用的都是异步,无法保证回调结果那个先获取到
// 所以可能出现先获得文件属性然后改名成功,也可能相反
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)
})
// 正式写法
// 但这样就可能陷入到回调地狱中,所以后续的开发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 href="https://www.jb51.net/article/58625.htm">参考</a>
- **fs.readFile(path, options, callback):读取文件获取数据**
path:是路径
options:是配置参数,可有可无
- **fs.writeFile(file, data, options, callback):写入数据**
file:文件名或文件路径
data:数据,字符串类型的数据
<br>
<br>
<br>
### http (请求)
  在框架中都会被封装,用于连接服务器
<br>
<br>
<br>
### path(路径)
  主要用于路径的生成,转化,规范路径,了解即可
- **path.format(otpions):将配置转为字符串路径**
```javascript
// `root` 会被忽略。
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');
// 如果当前工作目录是 /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启动的文件所在目录
path.join('foo', {}, 'bar');
// 抛出 'TypeError: Path must be a string. Received {}'
```
<br>
<br>
<br>