Node express Generator環境安裝與解析

使用 Express-Generator 來自動產生環境

node版本 14.20.1
全域方法安裝express-generator
在 Express 4.16 時,將 body-parser 改為 內建選項 ,所以不需要進行安裝,但如果是 4.16 之前的版本則需要透過 npm 來安裝。

1
npm install express-generator -g

项目初始化:專案名稱

1
express -e 專案名稱

cd 專案名稱

1
2
到專案
cd 專案名稱

//啟動

1
2
npm start

到此網址觀看
http://localhost:3000

解析資料夾內容 tree

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
┌── app.js
├── bin
│ └── www // 程式進入點
├── package-lock.json
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.css
├── routes // 路由
│ ├── index.js
│ └── users.js
└── views
├── error.ejs
├── index.ejs

bin/www 是整個程式的進入點,

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
/**
* 模組依賴關係。
*/

var app = require('../index');
var debug = require('debug')('lara-node-express-mysql:server');
var http = require('http');

/**
* Get port from environment and store in Express.
*/

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
* 建立 HTTP 伺服器。
*/

var server = http.createServer(app);

/**
* 在所有網路介面上偵聽提供的連接埠。
*/

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

/**
* 將連接埠標準化為數字、字串或 false。
*/

function normalizePort(val) {
var port = parseInt(val, 10);

if (isNaN(port)) {
// named pipe
return val;
}

if (port >= 0) {
// port number
return port;
}

return false;
}

/**
* HTTP 伺服器「錯誤」事件的事件偵聽器。
*/

function onError(error) {
if (error.syscall !== 'listen') {
throw error;
}

var bind = typeof port === 'string'
? 'Pipe ' + port
: 'Port ' + port;

// 用友善的訊息處理特定的監聽錯誤
switch (error.code) {
case 'EACCES':
console.error(bind + ' 需要提升權限');
process.exit(1);
break;
case 'EADDRINUSE':
console.error(bind + ' 已在使用中');
process.exit(1);
break;
default:
throw error;
}
}

/**
* HTTP 伺服器「監聽」事件的事件監聽器。
*/

function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
}

package.json 解析
package.json文件中最重要的就是name和version字段,這兩項是必填的。
name必須小於等於214個字符,不能以.或_開頭,不能有大寫字母,因為名稱最終成為URL的一部分因此不能包含任何非URL安全字符。
npm官方建議我們不要使用與核心節點模組相同的名稱。
version一般的格式是x.x.x, 並且需要遵循該規則。
private如果這個屬性被設定為true,npm將拒絕發布它,這是為了防止一個私有模組被無意間發佈出去。
description是一個字串,用於編寫描述資訊。有助於人們在npm庫中搜尋的時候發現你的模組。
keywords是一個字串組成的數組,有助於人們在npm庫中搜尋的時候發現你的模組。
scripts字段指定了執行腳本指令的npm命令列縮寫,例如start指定了執行npm run start時,所要執行的命令。
dependencies
dependencies欄位指定了專案運行所依賴的模組,devDependencies指定專案開發所需的模組。
它們的值都是一個物件。該物件的各個成員,分別由模組名和對應的版本要求組成,表示依賴的模組及其版本範圍。
當安裝依賴的時候使用–save參數表示將該模組寫入dependencies屬性,–save-dev表示將該模組寫入devDependencies屬性。
enginesengines欄位指明了該模組運作的平台,例如Node或npm的某個版本或瀏覽器。
參考資料

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
{
"name": "lara-node-express-mysql",
"version": "0.0.0",
"private": true,
"description": "antd-theme",
"keywords":["node.js","antd", "theme"],
"homepage": "https://zhiqianduan.com",
"bugs":{"url":"http://path/to/bug","email":"yindong@xxxx.com"},
"license": "ISC",
"author": "yindong",
"contributors":[{"name":"yindong","email":"yindong@xxxx.com"}],
"files": "",
"main": "./dist/default.js",
"bin": "",
"man": "",
"directories": "",
"repository": {
"type": "git",
"url": "https://path/to/url"
},
"scripts": {
"test": "node ./bin/www",
"start": "node index.js"
},
"dependencies": {
"cookie-parser": "~1.4.4",
"debug": "~2.6.9",
"ejs": "~2.6.1",
"express": "~4.16.1",
"http-errors": "~1.6.3",
"morgan": "~1.9.1"
}
}

解析 router
路由是指應用程式的端點 (URI) 如何回應客戶端請求。
這些路由方法指定一個回呼函數(有時稱為「處理函數」),當應用程式收到指定路由(端點)和 HTTP 方法的請求時呼叫。
用程式「偵聽」與指定路由和方法相符的請求,當偵測到匹配時,它會呼叫指定的回調函數。
routes/index.js

1
2
3
4
5
6
7
const express = require('express')
const app = express()

// 當向主頁發出 GET 請求時,回應“hello world”
app.get('/', (req, res) => {
res.send('hello world')
})

Method

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// GET method route
app.get('/', (req, res) => {
res.send('GET request to the homepage')
})

// POST method route
app.post('/users', (req, res) => {
res.send('POST request to the homepage')
})

app.all('/secret', (req, res, next) => {
console.log('訪問秘密部分 ...')
next() // pass control to the next handler
})

app.js

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
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

// 查看引擎設定
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// 捕獲 404 並轉送到錯誤處理程序
app.use((req, res, next)=> {
next(createError(404));
});

// 錯誤處理程序
app.use((err, req, res, next) =>{
// 設定局部變量,僅提供開發中的錯誤
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};

// 渲染錯誤頁面
res.status(err.status || 500);
res.render('error');
});
//使用 module.exports 匯出檔案
module.exports = app;

參考官網:Node express router

參考epxress generator 安裝