# 后端笔记

# node.js

# 介绍

作为一个异步事件驱动的 JavaScript 运行时,Node.js 被设计用来构建可扩展的网络应用。

const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14

https://nodejs.org/zh-cn/about/ (opens new window)

# npm

npm是世界上最大的开放源代码的生态系统,它是随NodeJS一起安装的包管理工具。 https://www.npmjs.com (opens new window)

# 查看npm 版本
npm -v
# 全局安装
npm install <package_name> -g
# 安装指定版本
npm install <package_name>@<version> # npm install jquery@1.8.0
# 安装并写入依赖
npm install <package_name> -S
# 安装并写入开发依赖
npm install <package_name> -D
# 根据package.json安装依赖
npm i
# 更新全部依赖
npm update
# 更新单个依赖
npm update <package_name>
# 删除包
npm uninstall <package_name>
# 查看已安装的包
npm list
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

https://docs.npmjs.com/updating-packages-downloaded-from-the-registry (opens new window)

# package.json

package.json定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)

创建package.json

npm init
npm init --yes
1
2

dependencies: 依赖 devDependencies: 开发依赖

"dependencies":{
  "ejs":"^2.3.4",
  "express":"^4.13.3"
}
1
2
3
4

^表示第一位版本号不变,后面两位取最新的 ~表示前两位不变,最后一个取最新 *表示全部取最新 没有符号,表示永远安装指定版本

# fs模块

# 常用方法

方法 描述
fs.stat 检测是文件还是目录
fs.mkdir 创建目录
fs.writeFile 创建写入文件
fs.appendFile 追加文件
fs.readFile 读取文件
fs.readdir 读取文件
fs.rename 重命名
fs.rmdir 删除目录
fs.unlink 删除文件
const fs = require('fs');

// 检查状态
fs.stat('./icon.png', (err,data)=>{
  if(err){
    console.log(err);
    return
  }
  console.log(`是文件:${data.isFile()}`) // true
  console.log(`是路径:${data.isDirectory()}`) // false
})

// 创建目录
fs.mkdir( './html', (err) =>
{
  if ( err ) {
    console.log( err )
    return
  }
  console.log('创建成功')
})

// 写入
/*
filename <String> 文件名称
data <String | Buffer> 将要写入的内容,可以是字符串或buffer数据
options <Object> option数组对象,包含:
.encoding <String> 可选值,默认'utf8'
.mode <Number> 文件读写权限,默认'w'
callback {Function} 回调,传递一个异常参数err.
*/
fs.writeFile( './html/index.html', '你好nodejs', ( err ) =>
{
  if ( err ) {
    console.log( err )
    return
  }
  console.log('写入成功')
})

// 追加文件
fs.appendFile( 'css/base.css', 'body{color:red}\n', ( err ) =>
{
  if ( err )
  {
    console.log( err )
    return
  }
  console.log('append file 成功')
})

// 读取文件 
fs.readFile( './css/index.html', ( err, data )=>{
  if ( err )
  {
    console.log( err )
    return
  }
  console.log(data.toString()) // data为Buffer类型
})

// 读取目录
fs.readdir( './css', ( err, data ) =>
{
  if ( err )
  {
    console.log( err )
    return
  }
  console.log(data)
})

/*
重命名 1.重命名 2.移动文件
原路径+名称,
新路径+名称,
回调函数
*/
fs.rename( './bomb.png', './css/bomb1.png', ( err ) =>
{
  if ( err )
  {
    console.log( err )
    return
  }
})

// 删除文件和目录
fs.unlink( './css/index.html', ( err ) =>
{
  if ( err )
  {
    console.log( err )
    return
  }
  console.log('删除文件成功')
})

fs.rmdir( './css', ( err ) =>
{
  if ( err )
  {
    console.log( err )
    return
  }
  console.log('删除路径成功')
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107

# 从文件流中读取数据

const fs = require( 'fs' )

const readStream = fs.createReadStream( './input.text' );
let count = 0;
let str = '';

readStream.on( 'data', ( data ) => {
  str += data;
  count++;
} )

readStream.on( 'end', () => {
  console.log(str);
  console.log(count);
} )

readStream.on( 'error', (err) => {
  console.log(err);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 以流的方式写入文件

const fs = require( 'fs' );

let str = '';
for ( let i = 0; i < 500; i++ ){
  str +='我是从数据库获取的数据,我要保存起来\n'
}
const writeStream = fs.createWriteStream( './output.text' );
writeStream.write( str );
//标记写入完成
writeStream.end();
writeStream.on( 'finish', () => {
  console.log('写入完成');
})
1
2
3
4
5
6
7
8
9
10
11
12
13

# 管道流

const fs = require( 'fs' );

const readStream = fs.createReadStream( './bomb.png', );
const writeStream = fs.createWriteStream( './path/bomb.png' );
// 用于复制大文件
readStream.pipe( writeStream );
1
2
3
4
5
6

https://nodejs.org/api/fs.html#fs_file_system (opens new window)

# saync await异步编程

const fs = require( 'fs' );
// 判断路径下是否为文件夹
async function isDir( dir ) {
  return new Promise( ( resole, reject ) => {
    fs.stat( dir, ( err, stats ) => {
      if ( err ) {
        console.log( err );
        reject( err );
        return;
      }
      if ( stats.isDirectory() ) {
        resole(true);
      } else {
        resole(false);
      }
    })
  })
}
// 将路径下的文件夹保存到数组
function main() {
  let path = './path'
  let dirArray = []

  fs.readdir( path, async ( err, files ) => {
    if ( err ){
      console.log( err );
      return
    }
    for ( let i = 0; i < files.length; i++ ){
      if ( await isDir( path + '/' + files[i] ) ) {
        dirArray.push(files[i])
      }
    }
    console.log(dirArray);
  })
}

main();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

# 创建静态Web服务器

# 快速实现

const fs = require( 'fs' );
const http = require( 'http' );
const path = require( 'path' );
const url = require( 'url' );

http.createServer( ( req, res ) => {
  // 1.获取地址
  let pathName = url.parse(req.url).pathname;
  pathName = pathName === '/' ? '/index.html' : pathName;
  let extName = path.extname( pathName );
  // 2.通过fs模块读取文件
  if ( pathName !== '/favicon.ico' ) {
    fs.readFile( './static' + pathName, ( err, data ) => {
      if ( err ) {
        res.writeHead( 404, { 'Content-Type': 'text/html; charset ="UTF-8"' } );
        res.end('这个页面不存在。')
      }
      let mime = getMime( extName );
      res.writeHead( 200, { 'Content-Type': '' + mime + '; charset ="UTF-8"' } );
      res.end( data );
    })
  }
}).listen(3000);

function getMime( extName ) {
  switch ( extName ) {
    case '.html':
      return 'text/html';
    case '.css':
      return 'text/css';
    case '.js':
      return 'text/javascript';
    default:
      return 'text/html'
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

# mongodb

https://github.com/mongodb/node-mongodb-native (opens new window)

下载 https://www.mongodb.com/try/download/community (opens new window)

# express

$ npm install express --save
1

https://www.expressjs.com/ (opens new window) https://www.expressjs.com.cn/ (opens new window)

# nodemon.js

nodemon是一个开发node.js应用程序的工具,它可以在检测到目录中的文件更改时自动重新启动node应用程序。

github: <github.com/remy/nodemon>

# 安装

npm install -g nodemon
# 或:
npm install --save-dev nodemon
1
2
3

# 使用

nodemon [your node app]
# CLI选项
nodemon -h
# 主机 端口
nodemon ./server.js localhost 8080
# inspect标签
nodemon --inspect ./server.js 80
# 手动重启
rs
# 延迟重启
nodemon --delay 10 server.js
nodemon --delay 2.5 server.js
nodemon --delay 2500ms server.js
1
2
3
4
5
6
7
8
9
10
11
12
13

文档 https://www.npmjs.com/package/nodemon (opens new window)

# silly-datetime

日期格式化模块

# 安装

# npm
npm i silly-datetime --save
# bower
bower install silly-datetime --save
1
2
3
4

# 示例

var sd = require('silly-datetime');
sd.format(new Date(), 'YYYY-MM-DD HH:mm');
// 2015-07-06 15:10
 
sd.fromNow(+new Date() - 2000);
// a few seconds ago
1
2
3
4
5
6

ES2015:

import {
    format,
    fromNow
} from 'silly-datetime';
format(new Date(), 'YYYY-MM-DD HH:mm'); // 2015-07-06 15:10
fromNow(+new Date() - 2000); // a few seconds ago
1
2
3
4
5
6

https://www.npmjs.com/package/silly-datetime (opens new window)

# mkdirp

创建目录

const mkdirp = require('mkdirp')
 
// return value is a Promise resolving to the first directory created
mkdirp('/tmp/foo/bar/baz').then(made =>
  console.log(`made directories, starting with ${made}`))
1
2
3
4
5

https://www.npmjs.com/package/mkdirp (opens new window)

# caddyserver

在本地开发环境下实现HTTPS

下载:

https://github.com/caddyserver/caddy/releases/tag/v2.3.0 (opens new window)

安装:

下载Windows应该版本,解压得到caddy.exe,将文件路径添加到环境变量

作为静态文件服务器使用:

在网站目录下新建Caddyfile文件(不要有扩展名),编辑内容:

localhost:2021
root D:\www
file_server browse
1
2
3

运行:

打开命令行,cd到网站目录,执行:

caddy run
1

打开浏览器,输入地址:https://localhost:2021/访问网站

文档 (opens new window)

上次更新: 2021-2-28 19:32:34