Express æå¸ 2ï¼åµå»ºä¸å骨æ¶ç¶²ç«
å¨ Express æç¨ç第äºç¯æç« ï¼æ¼ç¤ºå¦ä½åµå»ºä¸å "骨æ¶" ç¶²ç«é ç®ï¼ä½ å¯ä»¥æ¥èå¨è£¡é¢å å ¥ç¶²ç«ç¹å®çè·¯ç±ã模æ¿/è¦åã忏æ®åº«èª¿ç¨ã
| åç½®æ¢ä»¶: | æ¶è¨ä¸åNode éç¼ç°å¢ãåé¡§Express æç¨ã |
|---|---|
| ç®æ¨: | è½å¤ 使ç¨Express æç¨ç¢çå¨ï¼åµå»ºèªå·±æ°çç¶²é é ç®ã |
æ¦è¦½
æ¬ææ¼ç¤ºå¦ä½ä½¿ç¨ Express æç¨ç¢çå¨ å·¥å ·ï¼åµå»ºä¸å "骨æ¶" ç¶²ç«ï¼ç¶å¾ä½ å¯ä»¥ä½¿ç¨ç¹å®æ¼ç«é»çè·¯ç±ï¼è¦å/模æ¿åæ¸æåº«èª¿ç¨ä¾å¡«å å®åãå¨éåæç¨ï¼æåå°ä½¿ç¨è©²å·¥å ·ï¼çºæåçæ¬å°åæ¸é¤¨ç¶²ç«åµå»ºæ¡æ¶ï¼æåç¨å¾å°æ·»å è©²ç¶²ç«æéçææå ¶ä»ä»£ç¢¼ã該éç¨é常簡å®ï¼åªéè¦å¨å½ä»¤è¡ä¸ï¼ç¨æ°é ç®å稱調ç¨çæå¨ï¼éå¯ä»¥æå®ç«é»ç模æ¿å¼æå CSS çæå¨ã
以ä¸é¨ååä½ å±ç¤ºå¦ä½èª¿ç¨æç¨ç¨åºçæå¨ï¼ä¸¦æä¾éæ¼è¦åæ CSS çä¸åé¸é çä¸äºè§£éãæåéå°è§£é骨æ¶ç¶²ç«ççµæ§ãæå¾ï¼æåå°å±ç¤ºå¦ä½éè¡ç¶²ç«ï¼ä¾é©è宿¯å¦ææã
å註ï¼Express Application Generator 並é Express æç¨ç¨åºçå¯ä¸çæå¨ï¼çæçé ç®ä¸æ¯æ§å»ºæä»¶åç®éçå¯ä¸å¯è¡æ¹å¼ãç¶èï¼çæçç¶²ç«å ·æææ¼æ´å±åçè§£çæ¨¡å¡åçµæ§ãæéæå° Express æç¨ç¨åºçä¿¡æ¯ï¼è«åé± Hello world 示ä¾ï¼Express docsï¼ã
ä½¿ç¨æç¨ç¢çå¨
ä½ æè©²å·²ç¶å®è£äºçæå¨ï¼ä½çºè¨ç½® Node éç¼ç°å¢çä¸é¨åãä½çºå¿«éæéï¼ä½ å¯ä»¥ä½¿ç¨ NPM è»ä»¶å 管çå¨ï¼å¨æ´åç«é»å®è£çæå¨å·¥å ·ï¼å¦ä¸æç¤ºï¼
npm install express-generator -g
çæå¨æè¨±å¤é¸é
ï¼ä½ å¯ä»¥ä½¿ç¨--helpï¼æ-hï¼å½ä»¤ï¼å¨å½ä»¤è¡ä¸æ¥çå®åï¼
> express --help
Usage: express [options] [dir]
Options:
-h, --help output usage information
--version output the version number
-e, --ejs add ejs engine support
--pug add pug engine support
--hbs add handlebars engine support
-H, --hogan add hogan.js engine support
-v, --view <engine> add view <engine> support (ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
-c, --css <engine> add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
--git add .gitignore
-f, --force force on non-empty directory
ä½ å¯ä»¥ä½¿ç¨ Jade è¦å弿åç´ CSS ä¾æå® expressï¼ä»¥å¨ç¶åç®éä¸åµå»ºé
ç®ï¼å¦ææå®ç®éåï¼åé
ç®å°åµå»ºå¨å
·æè©²å稱çåæä»¶å¤¾ä¸ï¼ã
express
ä½ éå¯ä»¥ä½¿ç¨--view鏿è¦åï¼æ¨¡æ¿ï¼å¼æï¼ä¸¦ä¸/æè
使ç¨--css鏿 CSS çæå¼æã
å註ï¼é¸ææ¨¡æ¿å¼æçå
¶ä»é¸é
ï¼ä¾å¦ --hogan, --ejs, --hbsçï¼å·²è¢«æ£ç¨ãè«ç¨ --view (æ -v)!
ææè©²ç¨åªåè¦å弿?
Express Application Generator å è¨±ä½ é ç½®è¨±å¤æµè¡çè¦å/模æ¿å¼æï¼å æ¬ EJS, Hbs, Pug (Jade), Twig, å Vashï¼ä½å¦æä½ æ²ææå®è¦åé¸é ï¼å®æé»èªé¸æ Jadeã Express æ¬èº«ä¹å¯ä»¥æ¯æå¤§éå ¶ä»æ¨¡æ¿èªè¨ï¼æ¯ãéç®±å³å¯ä½¿ç¨ãçã
å註ï¼å¦æè¦ä½¿ç¨çæå¨ä¸æ¯æç模æ¿å¼æï¼è«åé±å¨ Express ä¸ä½¿ç¨æ¨¡æ¿å¼æï¼Express ææªï¼ï¼ä¸¦åé±ç®æ¨è¦åå¼æçææªã
ä¸è¬ä¾èªªï¼ä½ æè©²é¸æä¸ç¨®ãå¯ä»¥æä¾ä½ æéçææåè½ãçæ¨¡æ¿å¼æï¼ ä¸¦ä½¿ä½ è½å¤ åæ©æé«çç¢å - æå¥è©±èªªï¼å°±åä½ é¸æå ¶ä»çµä»¶ä¸æ¨£ï¼æ¯è¼æ¨¡æ¿å¼ææéè¦èæ ®çä¸äºäºé å¦ä¸ï¼
- å ·åçç¢åä¹åæéè¦è±è²»çæé â å¦æä½ çåéå·²ç¶ææ¨¡æ¿èªè¨çç¶é©ï¼é£éº¼ä½¿ç¨è©²èªè¨å¯è½ææ´å¿«å°æé«çç¢åã妿䏿¯ï¼é£éº¼ä½ æè©²èæ ®å鏿¨¡æ¿å¼æçç¸å°å¸ç¿æ²ç·ï¼å³ä»¥æå ¥æéèå¾å°ççç¢åçº XY åº§æ¨æç¹ªè£½çæ²ç·ï¼ã
- äººæ°£åæ´»èº â åé¡§å¼æçæ®åç¨åº¦ä»¥å宿¯å¦æææ´»èºç社åãç¶ä½ å¨ç¶²ç«ççå½é±æä¸éå°å顿ï¼è½å¤ ç²å¾å°å¼æçæ¯æé常éè¦ã
- é¢¨æ ¼ â æäºæ¨¡æ¿å¼æä½¿ç¨ç¹å®çæ¨è¨ï¼ä¾æç¤ºå¨ ãæ®éã HTML å §æå ¥çå §å®¹ï¼èå ¶ä»æ¨¡æ¿å¼æä½¿ç¨ä¸åçèªæ³ï¼ä¾å¦ï¼ä½¿ç¨ç¸®é²ååå¡åç¨±ï¼æ§é HTMLã
- æ§è½/渲ææéã
- ç¹é» â ä½ æè©²èæ
®ä½ çä¸ç弿æ¯å¦å
·æä»¥ä¸åè½ï¼
- ä½å±ç¹¼æ¿ï¼å è¨±ä½ å®ç¾©åºæ¬æ¨¡æ¿ï¼ç¶å¾ ãç¹¼æ¿ã å®çä¸é¨åï¼ä½¿ç¹å®é é¢å¯ä»¥æä¸åçåç¾ãæ¯èµ·ééå å«å¤§éå¿ éçµä»¶ï¼ææ¯æ¬¡å¾é éå§æ§å»ºæ¨¡æ¿ï¼ééå¸¸æ¯æ´å¥½çæ¹å¼ã
- "Include" æ¯æï¼å è¨±ä½ ééå å«å ¶ä»æ¨¡æ¿ï¼ä¾æ§å»ºæ¨¡æ¿ã
- ç°¡æ½çè®éåå¾ªç°æ§å¶èªæ³ã
- è½å¤ 卿¨¡æ¿ç´å¥é濾è®éå¼ï¼ä¾å¦ï¼å°è®éè¨ç½®çºå¤§å¯«ï¼ææ ¼å¼åæ¥æå¼ï¼ã
- è½å¤ çæ HTML 以å¤çè¼¸åºæ ¼å¼ï¼ä¾å¦ JSON æ XMLï¼ã
- æ¯æç°æ¥æä½åæµåªé«ã
- å¯ä»¥å¨å®¢æ¶ç«¯åæåå¨ä¸ä½¿ç¨ã妿å¯ä»¥å¨å®¢æ¶ç«¯ä¸ä½¿ç¨æ¨¡æ¿å¼æï¼åå 許æä¾æ¸æï¼ä¸¦æå¯è½å¨å®¢æ¶ç«¯å®ææææ¸²æï¼æå¤§é¨å渲æã
å註ï¼äºè¯ç¶²ä¸æè¨±å¤è³æºï¼å¯å¹«å©ä½ æ¯è¼ä¸åçè¦å/模æ¿å¼æé¸æï¼
å°æ¼éåé ç®ï¼æåå°ä½¿ç¨ Pug 模æ¿å¼æï¼éæ¯æè¿æ´åç Jade 弿ï¼ï¼å çºéæ¯ææµè¡ç Express / JavaScript 模æ¿èªè¨ä¹ä¸ï¼ä¸¦ä¸æç¨ç¼ç卿¯æéç®±å³ç¨ã
ææè©²ç¨åªå CSS 樣å¼å¼æ?
Express æç¨çæå¨å è¨±ä½ åµå»ºä¸åé ç®ï¼ä¸¦é ç½®æå¸¸è¦ç CSS 樣å¼è¡¨å¼æï¼LESS, SASS, Compass, Stylusã
å註ï¼CSS æä¸äºéå¶ï¼ä½¿æäºä»»åè®å¾å°é£ã CSS 樣å¼è¡¨å¼æå è¨±ä½ ä½¿ç¨æ´å¼·å¤§çèªæ³ä¾å®ç¾©ä½ ç CSSï¼ç¶å¾å°å®ç¾©ç·¨è¯çºç´ç²¹çèå¼ CSSï¼ä»¥ä¾ç覽å¨ä½¿ç¨ã
èæ¨¡æ¿å¼æä¸æ¨£ï¼ä½ æè©²ä½¿ç¨æ¨£å¼è¡¨å¼æï¼é樣å¯ä»¥è®ä½ çåéç²å¾æé«çç¢åãå°æ¼éåé ç®ï¼æåå°ä½¿ç¨æ®éç CSSï¼é»èªå¼ï¼ï¼å çºæåç CSS è¦æ±ä¸å¤ è¤éï¼æ²æå¿ è¦ä½¿ç¨å ¶ä»ä»»ä½æ±è¥¿ã
ææè©²ç¨åªåæ¸æåº«?
çæç代碼ä¸ä½¿ç¨/å å«ä»»ä½æ¸æåº«ã Express æç¨ç¨åºå¯ä»¥ä½¿ç¨ Node æ¯æç任使¸æåº«æ©å¶ï¼Express æ¬èº«ä¸¦æªéå°æ¸æåº«ç®¡çï¼å®ç¾©ä»»ä½ç¹å®çéå è¡çº/è¦æ±ï¼ã æåå°å¨å¾é¢çæç« ä¸ï¼è¨è«å¦ä½èæ¸æåº«éæã
åµå»ºé ç®
å°æ¼æåè¦æ§å»ºçç¤ºä¾ Local Library æç¨ç¨åºï¼æåå°ä½¿ç¨ Pug 模æ¿åº«ï¼åµå»ºä¸ååçº express-locallibrary-tutorial çé ç®ï¼ä¸¦ä¸ä¸ä½¿ç¨ CSS 樣å¼è¡¨å¼æã
é¦å å°è¦åµå»ºé ç®çä½ç½®ï¼ç¶å¾å¨å½ä»¤æç¤ºç¬¦ä¸ï¼éè¡ Express æç¨çæå¨ï¼å¦ä¸æç¤ºï¼
express express-locallibrary-tutorial --view=pug
æå¨å°åµå»ºï¼ä¸¦ååºï¼é ç®çæä»¶ã
create : express-locallibrary-tutorial
create : express-locallibrary-tutorial/package.json
create : express-locallibrary-tutorial/app.js
create : express-locallibrary-tutorial/public/images
create : express-locallibrary-tutorial/public
create : express-locallibrary-tutorial/public/stylesheets
create : express-locallibrary-tutorial/public/stylesheets/style.css
create : express-locallibrary-tutorial/public/javascripts
create : express-locallibrary-tutorial/routes
create : express-locallibrary-tutorial/routes/index.js
create : express-locallibrary-tutorial/routes/users.js
create : express-locallibrary-tutorial/views
create : express-locallibrary-tutorial/views/index.pug
create : express-locallibrary-tutorial/views/layout.pug
create : express-locallibrary-tutorial/views/error.pug
create : express-locallibrary-tutorial/bin
create : express-locallibrary-tutorial/bin/www
install dependencies:
> cd express-locallibrary-tutorial && npm install
run the app:
> SET DEBUG=express-locallibrary-tutorial:* & npm start
å¨è¼¸åºçµææï¼çæå¨æä¾éæ¼ãå¦ä½å®è£ä¾è³´éä¿ãçæç¤ºä¿¡æ¯ï¼å¦ package.json æä»¶ä¸æåï¼ï¼ä»¥åå¦ä½éè¡æç¨ç¨åºï¼ä¸è¿°èªªæé©ç¨æ¼ Windowsï¼å¨ Linux / macOS ä¸ï¼å®åæç¥æä¸åï¼ã
éè¡éª¨æ¶ç¶²ç«
å¨é䏿éé»ä¸ï¼æåæä¸å宿´ç骨æ¶é ç®ã該網ç«å¯¦éä¸ä¸¦æ²æå太å¤å·¥ä½ï¼ä½éè¡å®ï¼è½å¤ å±ç¤ºå®æ¯å¦ä½å·¥ä½çã
-
é¦å å®è£ä¾è³´é ï¼
installå®è£å½ä»¤ï¼å°ç²åé ç®ç package.json æä»¶ä¸ååºçææä¾è³´é å ï¼ãbashcd express-locallibrary-tutorial npm install -
ç¶å¾éè¡è©²æç¨ç¨åºã
-
å¨ Windows ä¸ï¼ä½¿ç¨æ¤å½ä»¤:
bashSET DEBUG=express-locallibrary-tutorial:* & npm start -
å¨ macOS æ Linuxï¼ä½¿ç¨æ¤å½ä»¤:
bashDEBUG=express-locallibrary-tutorial:* npm start
-
-
ç¶å¾å¨ç覽å¨ä¸å è¼
http://localhost:3000/ï¼ä»¥è¨ªå該æç¨ç¨åºã
ä½ æè©²æçå°ä¸åç覽å¨é é¢ï¼å°±å鿍£:

ä½ æä¸åè½å·¥ä½ç Express æç¨äºï¼è®å®å¨ http://localhost:3000/ æåã
å註ï¼ä½ ä¹å¯ä»¥ä½¿ç¨ npm start å½ä»¤ååæç¨ç¨åºãå¦ä¸åæç¤ºï¼æå® DEBUG è®éå¯åç¨æ§å¶å°æ¥èªè¨é/調試ãä¾å¦ï¼ç¶ä½ 訪åä¸é¢çé 颿ï¼ä½ æçå°å鿍£ç調試輸åºï¼
>SET DEBUG=express-locallibrary-tutorial:* & npm start
> express-locallibrary-tutorial@0.0.0 start D:\express-locallibrary-tutorial
> node ./bin/www
express-locallibrary-tutorial:server Listening on port 3000 +0ms
GET / 200 288.474 ms - 170
GET /stylesheets/style.css 200 5.799 ms - 111
GET /favicon.ico 404 34.134 ms - 1335
è®ä¼ºæå¨å¨æªæ¡æ´æ¹æéæ°åå
å¨ä½ éæ°ååæåå¨ä¹åï¼ä½ å° Express ç¶²ç«æåç任使´æ¹ï¼ç®åé½ä¸å¯è¦ãæ¯æ¬¡é²è¡æ´æ¹æï¼å¿ é 忢䏦鿰ååæåå¨ï¼å¾å¿«è®å¾éå¸¸ç ©äººï¼å æ¤å¼å¾è±æé使æåå¨å¨éè¦æï¼èªåéæ°ååã
éç¨®å·¥å ·ä¸ï¼æç°¡å®çä¹ä¸å°±æ¯ nodemonãéé常æ¯å ¨å±å®è£çï¼å çºå®æ¯ä¸åãå·¥å ·ãï¼ï¼ä½å¨éè£¡ï¼æåå°å¨æ¬å°å®è£å使ç¨å®ï¼ä½çºéç¼äººå¡ä¾è³´é ï¼ä»¥ä¾¿ä»»ä½ä½¿ç¨è©²é ç®çéç¼äººå¡ï¼å¨å®è£æç¨ç¨åºæèªåç²åå®ãå¨éª¨æ¶é ç®çæ ¹ç®éä¸ï¼ä½¿ç¨ä»¥ä¸å½ä»¤ï¼
npm install --save-dev nodemon
å¦æä½ æéé ç®ç package.json æä»¶ï¼ä½ ç¾å¨å°çå°ä¸åå ·ææ¤ä¾è³´éä¿çæ°å段ï¼
"devDependencies": {
"nodemon": "^1.14.11"
}
ç±æ¼è©²å·¥å
·æ²æå
¨å±å®è£ï¼æåç¡æ³å¾å½ä»¤è¡ååå®ï¼é¤éæåå°å
¶æ·»å å°è·¯å¾ä¸ï¼ï¼ä½æ¯æåå¯ä»¥å¾ NPM è
³æ¬ä¸èª¿ç¨å®ï¼å çº NPM ç¥éææéæ¼å®è£çè»ä»¶å
çä¿¡æ¯ãæ¾å°ä½ ç package.json çè
³æ¬ scripts åå¡ãæåæ´æ° scripts åå¡ï¼æåçä¸è¡ï¼ä»¥"start"éé ï¼å¨è©²è¡çæ«å°¾æ·»å éèï¼ä¸¦æ·»å "devstart" éé çä¸è¡ï¼å¦ä¸æç¤ºï¼
"scripts": {
"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"
},
ç¾å¨æåå¯ä»¥ç¨èåé¢å¹¾ä¹å®å ¨ç¸åçæ¹å¼ï¼ååæåå¨ï¼ä½ä½¿ç¨æå®ç devstart å½ä»¤ï¼
-
å¨ Windowsï¼ä½¿ç¨æ¤å½ä»¤:
bashSET DEBUG=express-locallibrary-tutorial:* & npm run devstart -
å¨ macOS or Linuxï¼ä½¿ç¨æ¤å½ä»¤:
bashDEBUG=express-locallibrary-tutorial:* npm run devstart
å註ï¼ç¾å¨ï¼å¦æä½ 編輯é
ç®ä¸çä»»ä½æä»¶ï¼æåå¨å°éæ°ååï¼æè
ä½ å¯ä»¥é¨æå¨å½ä»¤æç¤ºç¬¦ä¸ï¼éµå
¥rsä¾éæ°ååå®ï¼ãä½ ä»éè¦éæ°å è¼ç覽å¨ï¼ä»¥å·æ°é é¢ã
æåç¾å¨å¿
é 調ç¨ãnpm run <scriptname>ãè䏿¯ npm startï¼å çºãstartã實é䏿¯æ å°å°æå®è
³æ¬ç NPM å½ä»¤ãæåå¯ä»¥å¨ååè
³æ¬ä¸æ¿æè©²å½ä»¤ï¼ä½æååªæ³å¨éç¼æéä½¿ç¨ nodemonï¼å æ¤åµå»ºæ°çè
³æ¬å½ä»¤æ¯ææç¾©çã
å¾ç¢çå¨å¾å°çé ç®
ç¾å¨æåä¾ççæååååµå»ºçé ç®ã
ç®éçµæ§
å¾ç¢çå¨å¾å°ççæé ç®ï¼ç¾å¨å·²ç¶å®è£äºä¾è³´é ï¼å ·æä»¥ä¸æä»¶çµæ§ ï¼ä¸å¸¶åç¶´ ã/ã çé ç®ï¼è¡¨ç¤ºæä»¶ï¼ã package.json æä»¶å®ç¾©äºæç¨ç¨åºä¾è³´é ï¼åå ¶ä»ä¿¡æ¯ãå®éå®ç¾©äºä¸åååè ³æ¬ï¼å®å°èª¿ç¨æç¨ç¨åºå ¥å£é» JavaScript æä»¶ /bin/wwwãéè¨ç½®äºä¸äºæç¨ç¨åºçé¯èª¤èçï¼ç¶å¾å è¼ app.js ï¼ä¾å®æå©ä¸çå·¥ä½ãæç¨ç¨åºè·¯å¾ï¼åå²å¨ /routes ç®éä¸çå®ç¨æ¨¡å¡ä¸ã模æ¿åå²å¨ /views ç®éä¸ã
/express-locallibrary-tutorial
app.js
/bin
www
package.json
/node_modules
[about 4,500 subdirectories and files]
/public
/images
/javascripts
/stylesheets
style.css
/routes
index.js
users.js
/views
error.pug
index.pug
layout.pug
以ä¸åç¯å°è©³ç´°ä»ç´¹éäºæä»¶ã
package.json
package.json æä»¶å®ç¾©äºæç¨ç¨åºä¾è³´éä¿ï¼åå ¶ä»è¨æ¯ï¼
{
"name": "express-locallibrary-tutorial",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"
},
"dependencies": {
"body-parser": "~1.18.2",
"cookie-parser": "~1.4.3",
"debug": "~2.6.9",
"express": "~4.16.2",
"morgan": "~1.9.0",
"pug": "~2.0.0-rc.4",
"serve-favicon": "~2.4.5"
},
"devDependencies": {
"nodemon": "^1.14.11"
}
}
ä¾è³´éä¿å æ¬ express å¥ä»¶ï¼åæåæé¸è¦å弿ï¼pugï¼çå¥ä»¶ãå¦å¤ï¼æåéæä»¥ä¸çå¥ä»¶ï¼å¨è¨±å¤ Web æç¨ç¨åºä¸å¾æç¨ï¼
- body-parser: éè§£æå³å
¥ HTTP è«æ±çæ£æ body é¨åï¼ä¸¦æ´å®¹ææåå
å«ä¿¡æ¯çä¸åé¨åãä¾å¦ï¼ä½ å¯ä»¥ä½¿ç¨å®ä¾è®å
POST忏ã - cookie-parser: ç¨æ¼è§£æ cookie header 並填å
req.cookiesï¼æ¬è³ªä¸æä¾äºè¨ªå cookie ä¿¡æ¯çä¾¿æ·æ¹æ³ï¼ã - debug: ä¸åå°å node 調試ç¨åºï¼ä»¿ç § node æ ¸å¿ç調試æè¡å»ºç«çã
- morgan: æé node 使ç¨ç HTTP è«æ±è¨éå¨ä¸é層è»ä»¶ã
- serve-favicon: ç¨æ¼æä¾æ¶è忍 favicon ç node ä¸é層è»ä»¶ï¼éæ¯ç¨æ¼è¡¨ç¤ºç覽å¨é¸é å¡ãæ¸ç±¤çç¶²ç«å §ç忍ï¼ã
è
³æ¬é¨åï¼å®ç¾©äºä¸åãéå§ã "start" è
³æ¬ï¼ç¶æåèª¿ç¨ npm start ä¾ååæå卿ï¼éå°±æ¯æåæèª¿ç¨çè
³æ¬ãå¾è
³æ¬å®ç¾©ä¸ï¼ä½ å¯ä»¥çå°é實éä¸ç¨ node ååäº JavaScript æä»¶ ./bin/wwwãå®éå®ç¾©äºä¸åãdevstartã è
³æ¬ï¼æåå¨èª¿ç¨ npm run devstart æèª¿ç¨å®ãéå°ååç¸åç ./bin/www æä»¶ï¼ä½ä½¿ç¨ nodemon 調ç¨è䏿¯ node ã
"scripts": {
"start": "node ./bin/www",
"devstart": "nodemon ./bin/www"
},
www æä»¶
æä»¶ /bin/www æ¯æç¨ç¨åºå
¥å£é»ï¼å®åç第ä¸ä»¶äºæ¯ require() ãçæ£çã æç¨ç¨åºå
¥å£é»ï¼å³é
ç®æ ¹ç®éä¸ç app.js ï¼ï¼app.js æè¨ç½®ä¸¦è¿å express()æç¨ç¨åºçå°è±¡ã
#!/usr/bin/env node
/**
* Module dependencies.
*/
var app = require("../app");
å註ï¼require() æ¯ä¸åå
¨å± node 彿¸ï¼ç¨æ¼å°æ¨¡å¡å°å
¥ç¶åæä»¶ãé裡æå使ç¨ç¸å°è·¯å¾æå® app.js 模å¡ï¼ä¸¦çç¥å¯é¸çï¼.jsï¼æä»¶æ´å±åã
æ¤æä»¶ä¸çå ¶é¤ä»£ç¢¼ï¼å°è¨ç½®ä¸å node éè¡ç HTTP æåå¨ï¼ä¸¦å°æç¨ app è¨ç½®çºç¹å®ç端å£ï¼å¨ç°å¢è®éä¸å®ç¾©ï¼å¦æè®éæªå®ç¾©ï¼åå®ç¾©çº 3000ï¼ï¼ä¸¦éå§ç£è½åå ±åæåå¨é¯èª¤å飿¥ãç¾å¨ä½ 並ä¸éè¦ç¥é代碼çå ¶ä»å §å®¹ï¼éåæä»¶ä¸çææå §å®¹é½æ¯ ãæ¨£æ¿æä»¶ã ï¼ï¼ä½å¦æä½ æèè¶£ï¼å¯ä»¥é¨ææ¥çå®ã
app.js
æ¤æä»¶åµå»ºä¸å express æç¨ç¨åºå°è±¡ï¼æå³çµ±å½åçº appï¼ï¼ä½¿ç¨å種è¨ç½®åä¸éä»¶ï¼ä»¥è¨ç½®æç¨ç¨åºï¼ç¶å¾å¾æ¨¡å¡å°åºæç¨ç¨åºãä¸é¢ç代碼åªé¡¯ç¤ºäºæä»¶çä¸é¨åï¼åµå»ºåå°åºæç¨ç¨åºå°è±¡çé¨åï¼
var express = require('express');
var app = express();
...
module.exports = app;
åå°ä¸é¢ç www å
¥å£é»æä»¶ï¼å®æ¯å¨å°å
¥è©²æä»¶æï¼æä¾çµ¦èª¿ç¨è
çéå module.exports å°è±¡ã
è®æå詳細äºè§£ app.js æä»¶ãé¦å
ï¼æåä½¿ç¨ require()å°ä¸äºæç¨ç node 庫å°å
¥å°æä»¶ä¸ï¼å
¶ä¸å
æ¬æåå
åä½¿ç¨ NPM çºæç¨ç¨åºä¸è¼ç expressï¼serve-faviconï¼morganï¼cookie-parser å body-parserï¼å path 庫ï¼å®æ¯è§£ææä»¶åç®éè·¯å¾çæ ¸å¿ node 庫ã
var express = require("express");
var path = require("path");
var favicon = require("serve-favicon");
var logger = require("morgan");
var cookieParser = require("cookie-parser");
var bodyParser = require("body-parser");
ç¶å¾æåç¨ require()å°å
¥ä¾èªæåçè·¯ç±ç®éçæ¨¡å¡ãéäºæ¨¡å¡/æä»¶å
å«ç¨æ¼èçç¹å®çç¸éãè·¯ç±ãéåï¼URL è·¯å¾ï¼ç代碼ãç¶æåæ´å±éª¨æ¶æç¨ç¨åºï¼ä¾å¦ååºåæ¸é¤¨ä¸çæææ¸ç±æï¼æåå°æ·»å ä¸åæ°æä»¶ï¼ä¾èçèæ¸ç±ç¸éçè·¯ç±ã
var indexRouter = require("./routes/index");
var usersRouter = require("./routes/users");
åè¨»ï¼æ¤ææåååå°å ¥äºæ¨¡å¡ï¼æåéæ²æçæ£ä½¿ç¨éå®çè·¯ç±ï¼å¨æä»¶çæ´ä¸æ¹ä¸é»å°ä½¿ç¨å°è·¯ç±ï¼ã
æ¥ä¸ä¾ï¼æå使ç¨å°å
¥ç express æ¨¡å¡ ï¼åµå»ºæç¨ç¨åº app å°è±¡ï¼ç¶å¾ä½¿ç¨å®ä¾è¨ç½®è¦åï¼æ¨¡æ¿ï¼å¼æã弿çè¨ç½®æå
©åé¨åãé¦å
æåè¨ç½® 'views' å¼ï¼ä¾æå®æ¨¡æ¿å°è¢«åå²çæä»¶å¤¾ï¼å¨é種æ
æ³ä¸æ¯åæä»¶å¤¾ /viewsï¼ãç¶å¾æåè¨ç½® 'view engine' çå¼ï¼ä¾æå®æ¨¡æ¿åº«ï¼å¨æ¬ä¾ä¸çº ãpugã ï¼ã
var app = express();
// view engine setup
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "pug");
ä¸ä¸çµå½æ¸èª¿ç¨ app.use()ï¼å°ä¸éä»¶çåº«ï¼æ·»å å°è«æ±èçéä¸ãé¤äºæåä¹åå°å
¥çç¬¬ä¸æ¹åº«ä¹å¤ï¼æåéä½¿ç¨ express.static ä¸éä»¶ï¼ä¾ä½¿ Express æä¾å¨é
ç®æ ¹ç®éä¸ï¼/public ç®éä¸çææéæ
æä»¶ã
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger("dev"));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, "public")));
ç¾å¨ææå ¶ä»ä¸éä»¶é½å·²è¨ç½®å®ç¢ï¼æåå°ï¼å åå°å ¥çï¼è·¯ç±èçä»£ç¢¼ï¼æ·»å å°è«æ±èçéä¸ãå°å ¥ç代碼ï¼å°çºç¶²ç«çä¸åé¨åå®ç¾©ç¹å®è·¯ç±ï¼
app.use("/", indexRouter);
app.use("/users", usersRouter);
å註ï¼ä¸é¢æå®çè·¯å¾ ('/' and '/users')ï¼è¢«è¦çºå®ç¾©å¨å°å
¥æä»¶ä¸çè·¯ç±åç¶´ãå æ¤ï¼ä¾å¦ï¼å¦æå°å
¥çç¨æ¶æ¨¡å¡ usersçº/profileå®ç¾©äºè·¯ç±ï¼åå¯ä»¥å¨ /users/profileä¸è¨ªå該路ç±ãæåå°å¨å¾é¢çæç« ä¸ï¼è©³ç´°è¨è«è·¯ç±ã
æä»¶ä¸çæå¾ä¸åä¸éä»¶ï¼çºé¯èª¤å HTTP 404 é¿ææ·»å äºèçç¨åºæ¹æ³ã
// catch 404 and forward to error handler
app.use(function (req, res, next) {
var err = new Error("Not Found");
err.status = 404;
next(err);
});
// error handler
app.use(function (err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get("env") === "development" ? err : {};
// render the error page
res.status(err.status || 500);
res.render("error");
});
Express æç¨ç¨åºå°è±¡ï¼appï¼ç¾å·²å®å ¨å®æé ç½®ãæå¾ä¸æ¥ï¼æ¯å°å ¶æ·»å å°æ¨¡å¡å°åºï¼éå 許å®éé /bin/www å°å ¥ï¼ã
module.exports = app;
è·¯ç±
è·¯ç±ææª /routes/users.js å¦ä¸æç¤ºï¼è·¯ç±æä»¶å
±äº«ä¸åé¡ä¼¼ççµæ§ï¼æä»¥æåä¸éè¦ä¹é¡¯ç¤º index.jsï¼ãé¦å
å è¼ express æ¨¡å¡ ï¼ä¸¦ä½¿ç¨å®ç²å express.Routerå°è±¡ãç¶å¾å®å¨è©²å°å䏿å®ä¸åè·¯ç±ï¼æå¾å¾æ¨¡å¡ä¸å°åºè·¯ç±å¨ï¼éå°±æ¯å
è¨±å°æä»¶å°å
¥å° app.js ä¸çè·¯ç±ï¼ã
var express = require("express");
var router = express.Router();
/* GET users listing. */
router.get("/", function (req, res, next) {
res.send("respond with a resource");
});
module.exports = router;
該路ç±å®ç¾©äºä¸åå調ï¼åªè¦æª¢æ¸¬å°å
·ææ£ç¢ºæ¨¡å¼ç HTTP GET è«æ±ï¼å°±æèª¿ç¨è©²å調ãå¹é
æ¨¡å¼æ¯æ¨¡å¡å°å
¥ææå®çè·¯ç±ï¼'/users'ï¼ï¼å ä¸ï¼'/'ï¼æä»¶ä¸å®ç¾©çä»»ä½å
§å®¹ãæå¥è©±èªªï¼ç¶æ¶å°/users/ç URL æï¼å°ä½¿ç¨æ¤è·¯ç±ã
å註ï¼å試éè¡å¸¶æ node çæåå¨ï¼ä¸¦å¨ç覽å¨ä¸è¨ªåä»¥ä¸ URL: http://localhost:3000/users/ãä½ æè©²çå°ä¸æ¢æ¶æ¯ï¼'respond with a resource'ã
ä¸é¢æè¶£çäºæ
æ¯ï¼åèª¿å½æ¸æç¬¬ä¸å忏 'next'ï¼å æ¤æ¯ä¸åä¸é件彿¸ï¼è䏿¯ç°¡å®çè·¯ç±å調ãéç¶ä»£ç¢¼ç¶åä¸ä½¿ç¨ next 忏ï¼ä½å¦æè¦å¨'/'æ ¹è·¯ç±è·¯å¾ä¸ï¼æ·»å å¤åè·¯ç±èçç¨åºï¼å°ä¾å¯è½ææç¨ã
è¦å(模æ¿)
è¦åï¼æ¨¡æ¿ï¼åå²å¨ /views ç®éä¸ï¼å¦ app.js 䏿å®çï¼ä¸¦ä¸è¢«è³¦äºæä»¶æ´å±å**.pug**ãæ¹æ³ Response.render()ç¨æ¼åç¾æå®ç模æ¿ï¼ä»¥åå¨å°åä¸å³éçå½åè®éçå¼ï¼ç¶å¾å°çµæä½çºé¿æç¼éãå¨ä¾èª /routes/index.js ç以ä¸ä»£ç¢¼ä¸ï¼ä½ å¯ä»¥çå°ï¼è©²è·¯ç±å¦ä½ä½¿ç¨æ¨¡æ¿ "index" å³é模æ¿è®é "title" ï¼ä»¥åç¾é¿æã
/* GET home page. */
router.get("/", function (req, res) {
res.render("index", { title: "Express" });
});
ä¸é¢è·¯ç±çç¸ææ¨¡æ¿å¨ä¸é¢çµ¦åºï¼index.pugï¼ãæåç¨å¾æè©³ç´°è¨è«éåèªæ³ãä½ ç¾å¨éè¦ç¥éçæ¯ï¼æ¨é¡è®é titleï¼å¼çº 'Express'ï¼å°æå
¥æ¨¡æ¿ä¸æå®çä½ç½®ã
extends layout
block content
h1= title
p Welcome to #{title}
ææ°èªå·±
å¨ /routes/users.js ä¸åµå»ºä¸åæ°è·¯ç±ï¼å®å°å¨ /users/cool/ä¸é¡¯ç¤ºææ¬ ãYou're so coolããéééè¡æåå¨ï¼ä¸¦å¨ç覽å¨ä¸è¨ªå http://localhost:3000/users/cool/ 便¸¬è©¦å®ã
總çµ
ä½ ç¾å¨çº æ¬å°åæ¸é¤¨ åµå»ºäºä¸å骨æ¶ç¶²ç«é ç®ï¼ä¸¦ä¸ç¨ node é©èäºå®è½å¤ éè¡ãæéè¦çï¼ä½ ä¹çè§£äºé ç®ççµæ§ï¼å æ¤ä½ 乿ç½äºæåéè¦çºæ¬å°åæ¸é¤¨å ä¸è·¯ç±åè¦åã
æ¥ä¸ä¾æåå°éå§ä¿®æ¹éª¨æ¶ï¼è®å®è½åä¸ååæ¸é¤¨ç¶²ç«ä¸æ¨£éä½ã
åè¦
- Express application generator (Express docs)
- Using template engines with Express (Express docs)