# 后端笔记
# 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}/`);
});
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
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
2
dependencies: 依赖 devDependencies: 开发依赖
"dependencies":{
"ejs":"^2.3.4",
"express":"^4.13.3"
}
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('删除路径成功')
})
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);
})
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('写入完成');
})
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 );
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();
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'
}
}
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
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
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
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
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
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
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}`))
2
3
4
5