Express æå¸ 7: ä½ç½²å°çç¢ç°å¢
ç¾å¨ä½ å·²ç¶åµå»ºï¼ä¸¦æ¸¬è©¦ï¼äºä¸åä¸é¯ç æ¬å°åæ¸é¤¨ ç¶²ç«äºï¼ä½ æç®æå®ç¼ä½å°ä¸åå ¬å ±ç¶²çµ¡æåå¨ï¼éæ¨£åæ¸é¤¨ç®¡çå¡å網路ä¸çå ¶ä»æå¡å°±å¯ä»¥è¨ªåå®äºãéç¯æç« ç¸½çµäºä½ å¯ä»¥ææ¨£æ¾å°ä¸å°ä¸»æ©é¨ç½²ä½ çç¶²ç«ï¼ä»¥åä½ éè¦çºç¶²ç«æºå好ä½ç½²å°çç¢ç°å¢è©²åä»éº¼ã
| é åç¥è: | 宿å颿æçæå主é¡ï¼å æ¬ Express Tutorial Part 6: Working with forms. |
|---|---|
| ç®æ¨: | å¸ç¿ä½ å¯ä»¥ææ¨£ä»¥åå¨åªè£¡é¨ç½²ä¸å Express æç¨å°çç¢ç°å¢ã |
æ¦è¦½
䏿¦ä½ çç«é»å®æï¼æå®æ ãè¶³å¤ ã 以éå§å ¬å ±æ¸¬è©¦ï¼ï¼ä½ å°éè¦å°å ¶è¨ç®¡å¨æ¯ä½ çå人éç¼è¨ç®æ©ï¼æ´å ¬éåå¯è¨ªåçå°æ¹ã
å°ç®åçºæ¢ï¼ä½ ä¸ç´å¨éç¼ç°å¢ä¸å·¥ä½ï¼ä½¿ç¨ Express / Node ä½çº Web æåå¨ï¼å°ä½ çç«é»å ±äº«å°æ¬å°ç覽å¨/網路ï¼ä¸¦ä½¿ç¨ï¼ä¸å®å ¨çï¼éç¼è¨ç½®éè¡ä½ çç¶²ç«ï¼ä»¥é¡¯ç¤ºèª¿è©¦åå ¶ä»ç§äººä¿¡æ¯ãå¨ä½ å¯ä»¥å¨å¤é¨è¨ç®¡ç¶²ç«ä¹åï¼ä½ é¦å å¿ é ï¼
- 鏿è¨ç®¡ Express æç¨ç¨åºçç°å¢ã
- å°é ç®è¨ç½®é²è¡ä¸äºæ´æ¹ã
- è¨ç½®çç¢ç´å¥çåºç¤æ¶æ§ï¼ä»¥æåä½ çç¶²ç«ã
æ¬æç¨æä¾äºï¼æé鏿è¨ç®¡ç«é»çé¸é çä¸äºæå°ï¼ç°¡è¦æ¦è¿°äºçºä½¿ä½ ç Express æç¨ç¨åºæºå好çç¢ï¼æéå·è¡çæä½ï¼ä»¥åä¸åå·¥ä½ç¤ºä¾ï¼æ¼ç¤ºå¦ä½å° LocalLibrary ç¶²ç«å®è£å° Heroku é²è¨ç®¡ä¸çæåã
è«è¨ä½ï¼ä½ ä¸å¿ ä½¿ç¨ Heroku - éæå ¶ä»è¨ç®¡æåå¯ç¨ãæåéæä¾äºä¸åå®ç¨çæç¨ï¼ä»¥å±ç¤ºå¦ä½å¨ PWS/Cloud Foundry ä¸å®è£ LocalLibraryã
ä»éº¼æ¯çç¢ç°å¢ï¼
çç¢ç°å¢æ¯æåå¨è¨ç®æ©æä¾çç°å¢ï¼ä½ å¯ä»¥å¨å ¶ä¸éè¡ç¶²ç«ï¼ä»¥ä¾å¤é¨ä½¿ç¨ãç°å¢å æ¬ï¼
- ç¶²ç«éè¡çè¨ç®æ©ç¡¬ä»¶ã
- æä½ç³»çµ±ï¼ä¾å¦ Linux æ Windowsï¼ã
- ç·¨ç¨èªè¨éè¡åº«åæ¡æ¶åº«ï¼å¨å ¶ä¸ç·¨å¯«ä½ çç¶²ç«ã
- Web æåå¨åºç¤çµæ§ï¼å¯è½å å« Web æåå¨ï¼åå代çï¼è² è¼å¹³è¡¡å¨çã
- ä½ çç¶²ç«æä¾è³´çæ¸æåº«ã
æåå¨è¨ç®æ©ï¼å¯ä»¥ä½æ¼ä½ çå ´æï¼ä¸¦ééå¿«é鿥ï¼é£æ¥å° Internetï¼ä½ä½¿ç¨ ãè¨ç®¡å¨é²ä¸ã çè¨ç®æ©æ´çºå¸¸è¦ãé實é䏿å³èï¼ä½ ç代碼éè¡å¨è¨ç®¡å ¬å¸çæ¸æä¸å¿çæå°é ç¨è¨ç®æ©ï¼æå¯è½æ¯ãèæ¬ãè¨ç®æ©ï¼ãé ç¨æåå¨ï¼é常æä»¥ç¹å®å¹æ ¼æä¾äºè¯ç¶²é£æ¥ï¼åä¸äºä¿èç´å¥çè¨ç®è³æºï¼ä¾å¦ CPUï¼RAMï¼åå²å¨çï¼ã
é種å¯é ç¨è¨ªåçè¨ç®/網絡硬件ï¼ç¨±çºåºç¤æ¶æ§å³æåï¼IaaSï¼ãè¨±å¤ IaaS 便åï¼æä¾é å®è£ç¹å®æä½ç³»çµ±çé¸é ï¼ä½ å¿ é å¨å ¶ä¸ï¼å®è£çç¢ç°å¢çå ¶ä»çµä»¶ãå ¶ä»ä¾æåï¼å è¨±ä½ é¸æåè½æ´å ¨é¢çç°å¢ï¼å¯è½å æ¬å®æ´ç node è¨ç½®ã
å註ï¼é æ§å»ºç°å¢ï¼å¯ä»¥ä½¿ä½ çç¶²ç«è¨ç½®è®å¾é常簡å®ï¼å çºå®åææ¸å°é ç½®ï¼ä½å¯ç¨é¸é å¯è½æéå¶ä½ 使ç¨ä¸çæçæåå¨ï¼æå ¶ä»çµä»¶ï¼ï¼ä¸¦ä¸å¯è½åºæ¼è¼èçæ¬çæä½ç³»çµ±ãé常æå¥½èªå·±å®è£çµä»¶ï¼ä»¥ä¾¿ç²å¾æéççµä»¶ï¼ä¸¦ä¸ç¶ä½ éè¦åç´ç³»çµ±çæäºé¨åæï¼ä½ å¯ä»¥ç¥éå¾åªè£¡éå§ï¼
å ¶ä»è¨ç®¡æåæä¾åï¼æ¯æ Express ä½çºå¹³å°å³æåï¼PaaSï¼ç¢åçä¸é¨åãä½¿ç¨æ¤é¡è¨ç®¡æï¼ä½ ç¡éæå¿å¤§å¤æ¸çç¢ç°å¢ï¼æåå¨ï¼è² è¼å¹³è¡¡å¨çï¼ï¼å çºä¸»æ©å¹³å°æçºä½ èçéäºåé¡ãé使å¾é¨ç½²é常簡å®ï¼å çºä½ åªéè¦å°æ³¨æ¼ Web æç¨ç¨åºï¼è䏿¯ä»»ä½å ¶ä»æåå¨åºç¤çµæ§ã
ä¸äºéç¼äººå¡é¸æ IaaS ï¼ç¸å°æ¼ PaaS ï¼IaaS æä¾æ´é«éæ´»æ§ï¼èå ¶ä»éç¼äººå¡å好 PaaS çéä½ç¶è·éé·ï¼åæ´è¼é¬çæ´å±æ§ãç¶ä½ å¨ä¸éå§ä½¿ç¨æï¼å¨ PaaS 系統ä¸è¨ç½®ä½ çç¶²ç«ï¼è¦å®¹æå¾å¤ï¼å æ¤æåå°å¨æ¬æç¨ä¸ä½¿ç¨ PaaSã
å註ï¼å¦æä½ 鏿 Node/Express å好çè¨ç®¡æåæä¾åï¼ä»åæè©²æä¾ï¼æéå¦ä½ä½¿ç¨ Web æåå¨ï¼æç¨ç¨åºæåå¨ï¼åå代ççä¸åé ç½®ï¼ä¾è¨ç½® Express ç¶²ç«ç說æãä¾å¦ï¼å¨ Digital Ocean ç node ç¤¾åææªä¸ï¼æè¨±å¤å種é ç½®çææææåã
鏿ä¸å主æ©ä¾æå
ç¾æå¨ç¥ï¼ç¾å¤è¨ç®¡æåæä¾åï¼é½ç©æ¥µæ¯ææè Nodeï¼å Expressï¼åä½ãéäºä¾æåæä¾ä¸åé¡åçç°å¢ï¼IaaSï¼PaaSï¼ï¼ä»¥åä¸å广 ¼çä¸åç´å¥çè¨ç®åç¶²çµ¡è³æºã
åè¨»ï¼æå¾å¤è¨ç®¡è§£æ±ºæ¹æ¡ï¼ä»åçæååå®å¹ï¼å¯è½æé¨èæéèæ¹è®ãéç¶æåå¨ä¸é¢ä»ç´¹å¹¾åé¸é ï¼ä½å¨é¸æè¨ç®¡æåæä¾åä¹åï¼æå¿ è¦èªå·±é²è¡äºè¯ç¶²æç´¢ã
é¸æä¸»æ©æéè¦èæ ®çä¸äºäºé ï¼
- ä½ çç¶²ç«å¯è½æå¤å¿ï¼ä»¥åæ»¿è¶³è©²éæ±æéçæ¸æï¼åè¨ç®è³æºçææ¬ã
- æ°´å¹³æ´å±ï¼æ·»å æ´å¤æ©å¨ï¼ååç´æ´å±ï¼åç´å°æ´å¼·å¤§çæ©å¨ï¼çæ¯æç´å¥ï¼ä»¥å鿍£åçææ¬ã
- 便忿¸æä¸å¿çå°æ¹ï¼å æ¤è¨ªåå¯è½æ¯æå¿«çã
- ä¸»æ©æ£å¸¸éè¡æéååæ©æéçæ·å²è¡¨ç¾ã
- ç¨æ¼ç®¡çç«é»çå·¥å · - ææ¼ä½¿ç¨ä¸å®å ¨ï¼ä¾å¦ SFTP è FTPï¼ã
- ç¨æ¼ç£æ§æåå¨çå §ç½®æ¡æ¶ã
- å·²ç¥éå¶ãæäºä¸»æ©ææ æé»æ¢æäºæåï¼ä¾å¦é»åéµä»¶ï¼ãå ¶ä»å¨æäºå¹æ ¼å±¤ä¸ï¼å æä¾ä¸å®æ¸å°æç ã實ææéãï¼æè å æä¾å°éåå²ç©ºéã
- é¡å¤ç好èãä¸äºæä¾åå°æä¾å è²»ååå SSL èæ¸æ¯æï¼å¦åä½ å°ä¸å¾ä¸çºæ¤å¦å¤æ¯ä»è²»ç¨ã
- ä½ æä¾è³´çãå è²»ãçç´ï¼æ¯å¦æé¨èæéçæ¨ç§»èéæï¼ä»¥åé·ç§»å°æ´æè²´çç´çææ¬ï¼æ¯å¦æå³èä½ æå¥½å¨ä¸éå§å°±ä½¿ç¨å ¶ä»æåï¼
ç¶ä½ åéå§æï¼å¥½æ¶æ¯æ¯æå¾å¤ç¶²ç«æä¾ãå è²»ãçè¨ç®ç°å¢ï¼å管æä¸äºæ¢ä»¶ãä¾å¦ï¼ Heroku ãæ°¸é ã æä¾å è²»ä½è³æºæéç PaaS ç°å¢ï¼è Amazon Web Services, Microsoft Azure åéæºé¸é PWS/Cloud Foundry å¨ä½ ç¬¬ä¸æ¬¡å å ¥æï¼æä¾å 費信ç¨é¡åº¦ã
è¨±å¤æä¾åéææãåºæ¬ã層ï¼å¯æä¾æ´å¤æç¨çè¨ç®è½åï¼åæ´å°çéå¶ãèä¾ä¾èªªï¼ Digital Ocean æ¯ä¸åæµè¡çè¨ç®¡æåæä¾åï¼å®æä¾äºä¸åç¸å°ä¾¿å®çåºæ¬è¨ç®å±¤ï¼å¨æ¬æç¨å¯«ä½æï¼æ¯æ¯æ 5 ç¾å çè¼ä½ç¯åï¼ã
å註ï¼è«è¨ä½ï¼å¹æ ¼ä¸æ¯å¯ä¸çé¸ææ¨æºãå¦æä½ çç¶²ç«æåï¼å¯è½æç¼ç¾å¯æ´å±æ§æ¯æéè¦çèæ ®å ç´ ã
æºå好ç¼å¸ä½ çç¶²ç«
ç¼ä½ç¶²ç«æï¼è¦èæ ®ç主è¦å顿¯ç¶²çµ¡å®å ¨æ§åæ§è½ãè³å°ï¼ä½ éè¦åªé¤éç¼æéï¼é¯èª¤é é¢ä¸å å«çå æ£§è·è¸ªï¼æ´çæ¥èªè¨éï¼ä¸¦è¨ç½®é©ç¶çæ¨é ï¼ä»¥é¿å 許å¤å¸¸è¦çå®å ¨å¨è ã
å¨ä»¥ä¸å°ç¯ä¸ï¼æåæ¦è¿°äºä½ æè©²å°æç¨é²è¡çãæéè¦çæ´æ¹ã
å註ï¼Express ææªä¸éæå ¶ä»æç¨çæç¤º - è«åé±ãçç¢æä½³å¯¦è¸ï¼æ§è½åå¯é æ§ãï¼ä»¥åãçç¢æä½³å¯¦è¸ï¼å®å ¨æ§ãã
è¨ç½® NODE_ENV çº 'production'
æåå¯ä»¥ééå° NODE_ENV ç°å¢è®éï¼è¨ç½®çº production ï¼ä¾åªé¤é¯èª¤é é¢ä¸çå æ£§è·è¸ªï¼é»èªè¨ç½®çº ãdevelopmentã ï¼ãé¤äºçæè¼çºä¸è©³ç´°çé¯èª¤æ¶æ¯ä¹å¤ï¼éè¦å°è®éè¨ç½®çºçç¢ç·©åè¦å模æ¿ï¼åå¾ CSS æ´å±çæç CSS æä»¶ã測試表æï¼å°NODE_ENVè¨ç½®çºçç¢ï¼å¯ä»¥å°æç¨ç¨åºæ§è½æé«ä¸åï¼
å¯ä»¥ä½¿ç¨å°åºæç°å¢æä»¶ï¼æä½¿ç¨ OS åå§å系統ï¼ä»¥é²è¡æ¤æ´æ¹ã
å註ï¼é實é䏿¯å¨ç°å¢è¨ç½®ï¼è䏿¯æç¨ä¸æåçæ´æ¹ï¼ä½éè¦çæ¯ï¼è¦æ³¨æéè£¡ï¼æåå°å¨ä¸é¢ï¼å±ç¤ºæåçè¨ç®¡ç¤ºä¾è¦å¦ä½è¨ç½®ã
Log appropriately
è¨éå¼å«æå°é«æµéç¶²ç«ç¢çå½±é¿ãå¨çç¢ç°å¢ä¸ï¼ä½ å¯è½éè¦è¨éç¶²ç«æ´»åï¼ä¾å¦ï¼è·è¸ªæµéï¼æè¨é API 調ç¨ï¼ï¼ä½ä½ æå試æå°åçºèª¿è©¦ç®çèæ·»å çæ¥èªè¨ééã
å¨çç¢ç°å¢ä¸ï¼æå°åãèª¿è©¦ãæ¥èªè¨éçä¸ç¨®æ¹æ³ï¼æ¯ä½¿ç¨é¡ä¼¼èª¿è©¦ debug çæ¨¡å¡ï¼å è¨±ä½ ééè¨ç½®ç°å¢è®éï¼ä¾æ§å¶å·è¡çæ¥èªè¨éãä¾å¦ï¼ä¸é¢çä»£ç¢¼çæ®µï¼é¡¯ç¤ºå¦ä½è¨ç½® ãauthorã æ¥èªè¨éã調試è®é使ç¨å稱 ãauthorã è²æï¼ä¸¦ä¸å°èªå顯示ï¼ä¾èªæ¤å°è±¡çæææ¥èªçåç¶´ ãauthorãã
var debug = require("debug")("author");
// Display Author update form on GET
exports.author_update_get = function (req, res, next) {
req.sanitize("id").escape().trim();
Author.findById(req.params.id, function (err, author) {
if (err) {
debug("update error:" + err);
return next(err);
}
//On success
res.render("author_form", { title: "Update Author", author: author });
});
};
ç¶å¾ï¼ä½ å¯ä»¥ééå¨ DEBUG ç°å¢è®éä¸ï¼å°å®åæå®çºéèåéå表ï¼ä¾åç¨ç¹å®æ¥èªéãä½ å¯ä»¥è¨ç½®é¡¯ç¤ºä½è
åæ¸ç±æ¥èªçè®éï¼å¦åæç¤ºï¼ä¹æ¯æéé
符ï¼ã
#Windows
set DEBUG=author,book
#Linux
export DEBUG="author,book"
å註ï¼èª¿ç¨debugå¯ä»¥æ¿æä½ 以åä½¿ç¨ console.log()æconsole.error()å·è¡çæ¥èªè¨éãééèª¿è©¦æ¨¡å¡ debug é²è¡æ¥èªè¨éï¼æ¿æä»£ç¢¼ä¸çææconsole.log()調ç¨ãééè¨ç½® DEBUG è®éï¼ä¸¦å¨å
¶ä¸è¨éå°æ¥èªè¨éçå½±é¿ï¼å¨éç¼ç°å¢ä¸ï¼æéåé鿥èªè¨éã
å¦æä½ éè¦è¨éç¶²ç«æ´»åï¼å¯ä»¥ä½¿ç¨ Winston æ Bunyan çæ¥èªåº«ãæéæ¤ä¸»é¡çæ´å¤ä¿¡æ¯ï¼è«åé±ï¼çç¢æä½³å¯¦è¸ï¼æ§è½åå¯é æ§ã
ä½¿ç¨ gzip/deflate å£ç¸®é¿æ
Web æåå¨ï¼é常å¯ä»¥å£ç¸®ç¼éå客æ¶ç«¯ç HTTP é¿æï¼å¾èé¡¯èæ¸å°å®¢æ¶ç«¯ç²ååå è¼é 颿éçæéã使ç¨çå£ç¸®æ¹æ³ï¼å決æ¼å®¢æ¶ç«¯å¨è«æ±ä¸æ¯æçè§£å£ç¸®æ¹æ³ï¼å¦æä¸æ¯æå£ç¸®æ¹æ³ï¼åé¿æå°ä»¥æªå£ç¸®çæ¹å¼ç¼éï¼ã
ä½ å¯ä»¥ä½¿ç¨å£ç¸®ä¸éä»¶ compressionï¼å°å ¶æ·»å å°ä½ çç«é»ãééå¨é ç®çæ ¹ç®éä¸ï¼éè¡ä»¥ä¸å½ä»¤ï¼å°å ¶å®è£å°é ç®ä¸ã
npm install compression
æé**./app.js**ï¼ä¸¦å°å
¥å£ç¸®åº«ï¼å¦åæç¤ºãä½¿ç¨ use()æ¹æ³ï¼å°å£ç¸®åº«æ·»å å°ä¸éä»¶éï¼éæè©²åºç¾å¨ä½ æ³è¦å£ç¸®çä»»ä½è·¯ç±ä¹å - 卿¬æç¨é種æ
æ³ä¸ï¼å
¨é¨é½æ¯ï¼ï¼
var catalogRouter = require('./routes/catalog'); //Import routes for "catalog" area of site
var compression = require('compression');
// Create the Express application object
var app = express();
...
app.use(compression()); //Compress all routes
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/catalog', catalogRouter); // Add catalog routes to middleware chain.
...
å註ï¼å°æ¼çç¢ä¸æµéè¼å¤§çç¶²ç«ï¼ä½ ä¸æä½¿ç¨æ¤ä¸éä»¶ãç¸åï¼ä½ æä½¿ç¨å Nginx 鿍£çåå代çã
ä½¿ç¨ Helmet é¿å è¢«å¸¸è¦æ¼æ´ä¾µè¥²
Helmet æ¯ä¸åä¸éä»¶å ï¼å¯ä»¥ééè¨ç½®é©ç¶ç HTTP æ¨é ï¼ä¾å¹«å©ä¿è·ä½ çæç¨ï¼å åä¸äºç¾æå¨ç¥ç Web æ¼æ´çå½±é¿ï¼æéå®è¨ç½®çæ¨é /é²è·æ¼æ´ç詳細信æ¯ï¼è«åé±ææª docsï¼ ã
ééå¨é ç®çæ ¹ç®éä¸ï¼éè¡ä»¥ä¸å½ä»¤ï¼å°å ¶å®è£å°é ç®ä¸ã
npm install helmet
æé**./app.js**ï¼ä¸¦å°å
¥å¦åæç¤ºç helmet 庫ãç¶å¾ä½¿ç¨use()æ¹æ³ï¼å°æ¨¡å¡æ·»å å°ä¸éä»¶éã
var compression = require('compression');
var helmet = require('helmet');
// Create the Express application object
var app = express();
app.use(helmet());
...
å註ï¼ä¸é¢çå½ä»¤ï¼æ·»å äºå°å¤§å¤æ¸ç«é»ææç¾©çå¯ç¨æ¨é åéãä½ å¯ä»¥æç § npm ä¸ç說æï¼æ ¹æéè¦æ·»å /ç¦ç¨ç¹å®æ¨é ã
ä¾åï¼å¨ Heroku ä¸å®è£æ¬å°åæ¸é¤¨
æ¬ç¯æä¾å¦ä½å¨ Heroku PaaS cloud é²ä¸å®è£ LocalLibrary çå¯¦éæ¼ç¤ºã
çºä»éº¼é¸æ Heroku?
Heroku æ¯éè¡æéæé·ï¼ä¸æåæ¡è¿çåºæ¼é²ç PaaS æåä¹ä¸ã宿ååªæ¯æ Ruby æç¨ç¨åºï¼ä½ç¾å¨å¯ç¨æ¼è¨ç®¡ä¾èªè¨±å¤ç·¨ç¨ç°å¢çæç¨ç¨åºï¼å æ¬ Nodeï¼ä»¥å Expressï¼ï¼
æåé¸æä½¿ç¨ Heroku æä»¥ä¸å¹¾ååå ï¼
-
Heroku æä¸åå è²»å¥é¤ free tierï¼å管æä¸äºéå¶ï¼ã
-
ä½çº PaaSï¼Heroku çºæåæä¾äºå¤§éç Web åºç¤æ¶æ§ãé使å¾å ¥éæ´å 容æï¼å çºä½ ä¸å¿ æå¿æåå¨ï¼è² è¼å¹³è¡¡å¨ï¼åå代çï¼å´©æ½°æéæ°ååç¶²ç«ï¼æè Heroku çºæåæä¾çä»»ä½å ¶ä» Web åºç¤çµæ§ã
-
éç¶å®ç¢ºå¯¦æä¸äºéå¶ï¼ä½éäºä¸æå½±é¿éåç¹å®çæç¨ç¨åºãä¾å¦ï¼
- Heroku åªæä¾çæåå²ï¼å æ¤ç¨æ¶ä¸å³çæä»¶ç¡æ³å®å ¨å°åå²å¨ Heroku æ¬èº«ã
- 妿åå°æå §æ²æè«æ±ï¼å è²»å¥é¤å°ä½¿ä¸æ´»åç網絡æç¨ç¨åºé²å ¥ç¡ç ãç¶å¾ï¼è©²ç¶²ç«å¯è½éè¦å¹¾ç§éæè½è¢«åéã
- å è²»å¥é¤å°ä½ ç¶²ç«éè¡çæéï¼éå¶çºæ¯æä¸å®çå°ææ¸ï¼ä¸å æ¬ç¶²ç«ãç¡èãçæéï¼ãéå°æ¼ä½ä½¿ç¨/æ¼ç¤ºç«é»ä¾èªªå¾å¥½ï¼ä½å¦æéè¦ 100ï¼ çæ£å¸¸éè¡æéï¼åä¸é©ç¨ã
- Heroku 宿¹ææª Limits ä¸ååºçå ¶ä»éå¶ã
-
大夿¸æ æ³ä¸ï¼å®åªæ¯å¯ä»¥å·¥ä½ï¼å¦æä½ æçµåæ¡å®ï¼ä¸¦å¸æåç´ï¼é£éº¼æ´å±ä½ çæç¨ç¨åºé常容æã
éç¶ Heroku é常é©åèè¾¦æ¤æ¼ç¤ºï¼ä½å®å¯è½ä¸¦ä¸é©åä½ çç實網ç«ã Heroku å¯ä»¥è¼é¬è¨ç½®åæ´å±ï¼ä½ä»£å¹æ¯éæ´»æ§è¼ä½ï¼èä¸ä¸æ¦é åºå è²»å¥é¤ï¼å¯è½æè±è²»æ´å¤ã
Heroku å¦ä½å·¥ä½?
Heroku å¨ä¸åæå¤å "Dynos" ä¸éè¡ç¶²ç«ï¼éäº ãDynosã æ¯ç¨ç«çèæ¬å Unix 容å¨ï¼æä¾éè¡æç¨ç¨åºæéçç°å¢ã Dynos æ¯å®å ¨éé¢çï¼ä¸¦ä¸æä¸åçæ«çæä»¶ç³»çµ±ï¼ä¸åçæ«çæä»¶ç³»çµ±ï¼æ¯æ¬¡ dyno éæ°ååæé½ææ¸ ç/æ¸ ç©ºï¼ã dynos é»èªå ±äº«çå¯ä¸å §å®¹ï¼æ¯æç¨ç¨åºé ç½®è®é configuration variablesã Heroku å §é¨ä½¿ç¨è² è¼åè¡¡å¨ï¼å° Web æµéåé çµ¦ææ ãwebã dynosãç±æ¼å®åä¹éæ²æä»»ä½å ±äº«ï¼Heroku å¯ä»¥ééæ·»å æ´å¤ dynosï¼ä¾æ°´å¹³æ´å±æç¨ç¨åºï¼ç¶ç¶ï¼ä½ å¯è½ééè¦æ´å±æ¸æåº«ï¼ä»¥æ¥åå ¶ä»é£æ¥ï¼ã
ç±æ¼æä»¶ç³»çµ±æ¯çæ«çï¼å æ¤ç¡æ³ç´æ¥å®è£æç¨ç¨åºæéçæåï¼ä¾å¦æ¸æåº«ï¼éåï¼ç·©å系統ï¼åå²ï¼é»åéµä»¶æåçï¼ãç¸åï¼Heroku Web æç¨ç¨åºä½¿ç¨ Heroku æç¬¬ä¸æ¹ä½çºç¨ç«ãéå çµä»¶ãæä¾çæ¯ææåã飿¥å° Web æç¨ç¨åºå¾ï¼å¯ä»¥ééç°å¢è®éï¼å¨ Web æç¨ç¨åºä¸è¨ªåéå æåã
çºäºå·è¡ä½ çæç¨ç¨åºï¼Heroku éè¦è½å¤ è¨ç½®é©ç¶çç°å¢åä¾è³´éä¿ï¼ä¸¦äºè§£å®æ¯å¦ä½ååçãå°æ¼ Node æç¨ç¨åºï¼å®æéçææä¿¡æ¯é½æ¯å¾ package.jsonæä»¶ä¸ç²åçã
éç¼äººå¡ä½¿ç¨ç¹æ®ç客æ¶ç«¯æç¨ç¨åº/çµç«¯ï¼è Heroku 交äºï¼éå¾å Unix bash è ³æ¬ãéå è¨±ä½ ä¸å³åå²å¨ git å²å庫ä¸çä»£ç¢¼ï¼æª¢æ¥æ£å¨éè¡çé²ç¨ï¼æ¥çæ¥èªï¼è¨ç½®é ç½®è®éççï¼
çºäºè®æåçæç¨ç¨åºå¨ Heroku ä¸å·¥ä½ï¼æåéè¦å°æåç Express Web æç¨ç¨åºæ¾å ¥ git å²å庫ï¼ä¸¦å° package.json é²è¡ä¸äºå°çæ´æ¹ã宿å¾ï¼æåå¯ä»¥è¨ç½® Heroku 帳æ¶ï¼ç²å Heroku 客æ¶ç«¯ï¼ä¸¦ä½¿ç¨å®ä¾å®è£æåçç¶²ç«ã
éæ¯ä½ éå§æç¨æéçå ¨é¨æ¦è¿°ï¼æéæ´å ¨é¢çæåï¼è«åé±å¸¶æ Node.js çHeroku å ¥éï¼ã
å¨ Github ä¸åµå»ºä¸åæç¨å庫
Heroku è git æºä»£ç¢¼çæ¬æ§å¶ç³»çµ±ç·å¯éæï¼ä½¿ç¨å®ä¾ä¸å³/åæ¥ä½ å°å¯¦æéè¡ç³»çµ±æåç任使´æ¹ãå®ééæ·»å ä¸ååçº heroku çæ° Herokuãé ç¨ãå²å庫ï¼ä¾æåä½ å¨ Heroku é²ä¸çæºå²å庫ãå¨éç¼æéï¼ä½ ä½¿ç¨ git å¨ã主ãå²å庫 master ä¸å²åæ´æ¹ã妿è¦é¨ç½²ç«é»ï¼è«å°æ´æ¹åæ¥å° Heroku åå²åº«ã
å註ï¼å¦æä½ ç¿æ £æ¼éµå¾ªè¯å¥½çè»ä»¶éç¼å¯¦è¸ï¼é£éº¼ä½ å¯è½å·²ç¶å¨ä½¿ç¨ git æå ¶ä»ä¸äº SCM 系統ãå¦æä½ å·²æ git å²å庫ï¼åå¯ä»¥è·³éæ¤æ¥é©ã
æå¾å¤æ¹æ³å¯ä»¥ä½¿ç¨ gitï¼ä½æç°¡å®çæ¹æ³ä¹ä¸ï¼æ¯é¦å å¨ GitHub ä¸å»ºç«ä¸å帳æ¶ï¼å¨é£è£¡åµå»ºå²å庫ï¼ç¶å¾å¨æ¬å°åæ¥å®ï¼
-
訪å https://github.com/ 並åµå»ºä¸å帳æ¶ã
-
ç»éå¾ï¼å®æé é¨å·¥å ·æ¬ä¸ç + è鿥ï¼ç¶å¾é¸ææ°å»ºå²å庫 New repositoryã
-
填寫æ¤è¡¨å®ä¸çææå段ãéç¶éäºä¸æ¯å¼·å¶æ§çï¼ä½å¼·ç建è°ä½¿ç¨å®åã
- è¼¸å ¥æ°çåå²åº«å稱ï¼ä¾å¦ï¼express-locallibrary-tutorialï¼åæè¿°ï¼ä¾å¦ ã以 Expressï¼nodeï¼ç·¨å¯«çæ¬å°åæ¸é¤¨ç¶²ç«ãï¼ã
- å¨ Add .gitignore 鏿å表ä¸é¸æ Nodeã
- 卿·»å 許å¯è Add license 鏿å表ä¸ï¼é¸æä½ å好ç許å¯èã
- é»é¸ 使ç¨èªè¿°æä»¶åå§åæ¤å²å庫 Initialize this repository with a README.
-
æ Create repository.
-
宿æ°å庫é é¢ä¸çç¶ è²ãå éæä¸è¼ãæé "Clone or download" ã
-
å¾é¡¯ç¤ºçå°è©±æ¡çææ¬åæ®µï¼è¤è£½ URL å¼ï¼å®æè©²é¡ä¼¼æ¼ï¼
https://github.com/<your_git_user_id>/express-locallibrary-tutorial.gitï¼ã
ç¾å¨åµå»ºäºå²å庫ï¼ãrepoãï¼ï¼æåå°è¦å¨æ¬å°è¨ç®æ©ä¸å éå®ï¼
-
çºä½ çæ¬å°è¨ç®æ©å®è£ gitï¼ä½ å¯ä»¥å¨æ¤èæ¾å°ä¸åå¹³å°ççæ¬ï¼ã
-
æéå½ä»¤æç¤ºç¬¦/çµç«¯ï¼ä¸¦ä½¿ç¨ä½ å¨ä¸é¢è¤è£½ç URL ï¼å éå²å庫ï¼
bashgit clone https://github.com/<your_git_user_id>/express-locallibrary-tutorial.gitéå°å¨ç¶åæéé»ä¹å¾ï¼åµå»ºå²å庫ã
-
å°æ°çå²å庫ã
bashcd express-locallibrary-tutorial
æå¾ä¸æ¥ï¼æ¯è¤å¶ä½ çæç¨ç¨åºï¼ç¶å¾ä½¿ç¨ git ï¼å°æä»¶æ·»å å°ä½ çå庫ï¼
-
å° Express æç¨ç¨åºï¼è¤è£½å°æ¤æä»¶å¤¾ä¸ï¼ä¸å æ¬ /node_modulesï¼å ¶ä¸å å«ä½ ææ ¹æéè¦ï¼å¾ NPM ç²åçä¾è³´é æä»¶ï¼ã
-
æéå½ä»¤æç¤ºç¬¦/çµç«¯ï¼ä¸¦ä½¿ç¨
addå½ä»¤ï¼å°æææä»¶æ·»å å° gitãbashgit add -A -
ä½¿ç¨ status å½ä»¤ï¼æª¢æ¥è¦æ·»å çæææä»¶æ¯å¦æ£ç¢ºï¼ä½ 叿å 嫿ºæä»¶ï¼è䏿¯äºé²è£½æä»¶ï¼è¨ææä»¶çï¼ãå®æè©²çèµ·ä¾æé»åä¸é¢çå表ã
> git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: ... -
å¦æä½ æ»¿æï¼è«å°æä»¶æäº¤å°æ¬å°å²å庫ï¼
bashgit commit -m "First version of application moved into github" -
ç¶å¾ä½¿ç¨ä»¥ä¸å §å®¹ï¼å°æ¬å°å²ååº«åæ¥å° Github ç¶²ç«ï¼
bashgit push origin master
å®ææ¤æä½å¾ï¼ä½ æè©²å¯ä»¥è¿ååµå»ºå²å庫ç Github ä¸çé é¢ï¼å·æ°é é¢ï¼ä¸¦æ¥çä½ çæ´åæç¨ç¨åºç¾å·²ä¸å³ãä½¿ç¨æ¤æ·»å /æäº¤/æ¨é循ç°ï¼ä½ å¯ä»¥å¨æä»¶æ´æ¹æï¼ç¹¼çºæ´æ°å²å庫ã
å註ï¼éæ¯åä»½ä½ çãvanillaãé ç®çå¥½ææ© - éç¶æåå°å¨ä»¥ä¸é¨åä¸é²è¡çä¸äºæ´æ¹ï¼å¯è½å°ä»»ä½å¹³å°ï¼æéç¼ï¼ä¸çé¨ç½²æç¨ï¼èä¸äºå ¶ä»çæ´æ¹å¯è½æ²æç¨ã
å·è¡æ¤æä½çæä½³æ¹æ³ï¼æ¯ä½¿ç¨ git ä¾ç®¡çä½ çä¿®è¨ãä½¿ç¨ gitï¼ä½ ä¸å å¯ä»¥åå°ç¹å®çèçæ¬ï¼èä¸å¯ä»¥å¨çç¢è®æ´çå®ç¨ã忝ãä¸é²è¡ç¶è·ï¼ä¸¦é¸æå¨çç¢åéç¼åæ¯ä¹éç§»åç任使´æ¹ãå¸ç¿ Gité常å¼å¾ï¼ä½è¶ åºäºæ¬ä¸»é¡çç¯åã
æç°¡å®çæ¹æ³ï¼æ¯å°æä»¶è¤è£½å°å¦ä¸åä½ç½®ãä»¥ä½ å° git äºè§£ï¼ä½¿ç¨æç¬¦åçæ¹æ³ï¼
æ´æ° Heroku çæç¨ç¨åº
æ¬ç¯ä»ç´¹äºä½ éè¦å° LocalLibrary æç¨ç¨åºé²è¡çæ´æ¹ï¼ä»¥ä½¿å ¶å¨ Heroku ä¸éè¡ã
è¨ç½® node çæ¬
package.json å å«è§£æ±ºæç¨ç¨åºä¾è³´é æéçææå §å®¹ï¼ä»¥åååç«é»æï¼æååçæä»¶ã Heroku æª¢æ¸¬å°æ¤æä»¶çåå¨ï¼ä¸¦å°ä½¿ç¨å®ä¾é ç½®ä½ çæç¨ç¨åºç°å¢ã
æåç¶åç package.json ä¸ï¼ç¼ºå°çå¯ä¸æç¨ä¿¡æ¯ï¼æ¯ node ççæ¬ãæåå¯ä»¥ééè¼¸å ¥å½ä»¤ï¼æ¾å°æåç¨æ¼éç¼ç node çæ¬ï¼
>node --version
v8.9.1
æé package.jsonï¼ä¸¦å°æ¤ä¿¡æ¯æ·»å çº engines > node é¨åï¼å¦åæç¤ºï¼ä½¿ç¨ç³»çµ±ççæ¬èï¼ã
{
"name": "express-locallibrary-tutorial",
"version": "0.0.0",
"engines": {
"node": "8.9.1"
},
"private": true,
...
æ¸æåº«é ç½®
å°ç®åçºæ¢ï¼å¨æ¬æç¨ä¸ï¼æå使ç¨äºä¸åç¡¬ç·¨ç¢¼å° app.js çå®åæ¸æåº«ãé常æå叿ï¼è½å¤ çºçç¢åéç¼åµå»ºä¸åçæ¸æåº«ï¼æ¥ä¸ä¾æåå°ä¿®æ¹ LocalLibrary ç¶²ç«ï¼ä»¥å¾ OS ç°å¢ç²åæ¸æåº« URIï¼å¦æå·²å®ç¾©ï¼ï¼å¦åä½¿ç¨æåçéç¼æ¸æåº«ã
æé app.jsï¼ä¸¦æ¾å°è¨ç½® mongoDB 飿¥è®éçè¡ãå®çèµ·ä¾å鿍£ï¼
var mongoDB =
"mongodb://your_user_id:your_password@ds119748.mlab.com:19748/local_library";
使ç¨ä»¥ä¸ä»£ç¢¼æ¿æè©²è¡ï¼è©²ä»£ç¢¼ä½¿ç¨ process.env.MONGODB_URI å¾åçº MONGODB_URI çç°å¢è®éä¸ï¼ç²å飿¥å符串ï¼å¦æå·²è¨ç½®ï¼ï¼ä½¿ç¨ä½ èªå·±çæ¸æåº« URLï¼è䏿¯ä¸é¢çä½ä½ç¬¦ãï¼
var mongoDB =
process.env.MONGODB_URI ||
"mongodb://your_user_id:your_password@ds119748.mlab.com:19748/local_library";
å®è£ä¾è³´ä¸¦éæ°æ¸¬è©¦
卿åç¹¼çºä¹åï¼è®æå忬¡æ¸¬è©¦è©²ç¶²ç«ï¼ä¸¦ç¢ºä¿å®ä¸åæåç任使´æ¹çå½±é¿ã
é¦å ï¼æåéè¦ç²åæåçä¾è³´é ï¼ä½ æè¨å¾ï¼æå æ²æå° node_modulesæä»¶å¤¾ï¼è¤è£½å°æåç git 樹ä¸ï¼ãä½ å¯ä»¥ééå¨é ç®æ ¹ç®éççµç«¯ä¸ï¼éè¡ä»¥ä¸å½ä»¤ä¾å·è¡æ¤æä½ï¼
npm install
ç¾å¨éè¡è©²ç«é»ï¼è«å鱿¸¬è©¦è·¯ç±çç¸éå½ä»¤ï¼ï¼ä¸¦æª¢æ¥è©²ç«é»ï¼æ¯å¦ä»æé æéè¡ã
å°æ´æ¹ä¿åå° Github
æ¥ä¸ä¾ï¼è®æåå°æææ´æ¹ä¿åå° Githubãå¨çµç«¯ä¸ï¼å¨æåçå²å庫ä¸ï¼ï¼è¼¸å ¥ä»¥ä¸å½ä»¤ï¼
git add -A
git commit -m "Added files and changes required for deployment to heroku"
git push origin master
æåç¾å¨æè©²æºåéå§å¨ Heroku ä¸ï¼é¨ç½² LocalLibraryã
ç²åä¸å Heroku 帳æ¶
è¦éå§ä½¿ç¨ Herokuï¼ä½ é¦å éè¦åµå»ºä¸å帳æ¶ï¼å¦æä½ å·²ç¶ææä¸å帳æ¶ï¼ä¸¦å®è£äº Heroku 客æ¶ç«¯ï¼è«è·³éåµå»ºä¸¦ä¸å³ç¶²ç«ï¼ï¼
- 訪å www.heroku.com 䏦宿å 費註åæé SIGN UP FOR FREE
- è¼¸å ¥ä½ ç詳細信æ¯ï¼ç¶å¾æ CREATE FREE ACCOUNTã系統æè¦æ±ä½ ï¼æª¢æ¥å¸³æ¶ä¸æ¯å¦æè¨»åé»åéµä»¶ã
- å®æè¨»åé»åéµä»¶ä¸çå¸³æ¶æ¿æ´»éæ¥ãä½ å°å¨ç¶²çµ¡ç覽å¨ä¸æ¶åä½ ç帳æ¶ã
- è¼¸å ¥ä½ çå¯ç¢¼ï¼ç¶å¾å®æ SET PASSWORD AND LOGIN.
- ç¶å¾ï¼ä½ å°ç»é並é²å ¥ Heroku å表æ¿ï¼ https://dashboard.heroku.com/apps.
å®è£å®¢æ¶ç«¯
æç § Heroku ä¸ç說æï¼ä¸è¼ä¸¦å®è£ Heroku 客æ¶ç«¯ã
å®è£å®¢æ¶ç«¯åï¼ä½ å°è½å¤ éè¡å½ä»¤ãä¾å¦ï¼è¦ç²å¾å®¢æ¶ç«¯ç幫å©èªªæï¼
heroku help
åµå»ºä¸¦ä¸å³ç¶²ç«
è¦åµå»ºæç¨ç¨åºï¼æåå¨å²ååº«çæ ¹ç®éä¸ï¼éè¡ ãcreateã å½ä»¤ãéå°å¨æåçæ¬å° git ç°å¢ä¸ï¼åµå»ºä¸ååçº heroku ç git remoteï¼ãæåé ç¨å²å庫çæéãï¼ã
heroku create
å註ï¼å¦æä½ 顿ï¼å¯ä»¥å¨ãåµå»ºãcreate ä¹å¾æå®é ç¨å²å庫çå½åãå¦æä½ ä¸é樣åï¼ä½ æå¾å°ä¸å鍿©çååã該åç¨±ç¨æ¼é»èª URLã
ç¶å¾ï¼æåå¯ä»¥å°æåçæç¨ç¨åºï¼æ¨éå° Heroku å²å庫ï¼å¦ä¸æç¤ºãéå°ä¸å³æç¨ç¨åºï¼ç²åææä¾è³´é ï¼å°å ¶æå å° dyno ä¸ï¼ç¶å¾åå該ç«é»ã
git push heroku master
妿æåå¾å¹¸éï¼è©²æç¨ç¨åºç¾å¨æ£å¨ç¶²ç«ä¸ãéè¡ããè¦æéç覽å¨ä¸¦éè¡æ°ç¶²ç«ï¼è«ä½¿ç¨ä»¥ä¸å½ä»¤ï¼
heroku open
å註ï¼è©²ç«é»å°ä½¿ç¨æåçéç¼æ¸æåº«éè¡ãåµå»ºä¸äºæ¸æ¬åå ¶ä»å°è±¡ï¼ä¸¦æª¢æ¥è©²ç¶²ç«æ¯å¦æé æéè¡ãå¨ä¸ä¸ç¯ä¸ï¼æåå°å ¶è¨ç½®çºä½¿ç¨æåçæ°æ¸æåº«ã
è¨å®é ç½®è®é
ä½ å°å¾åä¸ç¯åæ¶èµ·ï¼æåéè¦å° NODE_ENV è¨ç½®çº 'production'ï¼ä»¥ä¾¿æé«æ§è½ï¼ä¸¦çææ´ç°¡æ½çé¯èª¤æ¶æ¯ãæåééè¼¸å ¥ä»¥ä¸å½ä»¤ï¼ä¾å®ææ¤æä½ï¼
>heroku config:set NODE_ENV='production'
Setting NODE_ENV and restarting limitless-tor-18923... done, v13
NODE_ENV: production
æåéæè©²ä½¿ç¨å®ç¨çæ¸æåº«é²è¡çç¢ï¼å¨MONGODB_URIç°å¢è®éä¸ï¼è¨ç½®å ¶ URIãä½ å¯ä»¥å®å ¨æç §æååä¾çæ¹å¼ï¼è¨ç½®æ°æ¸æåº«åæ¸æåº«ç¨æ¶ï¼ä¸¦ç²åå ¶ URIãä½ å¯ä»¥å¦ä¸åæç¤ºè¨ç½® URIï¼é¡¯ç¶ï¼è¦ä½¿ç¨ä½ èªå·±ç URIï¼ï¼
>heroku config:set MONGODB_URI='mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production'
Setting MONGODB_URI and restarting limitless-tor-18923... done, v13
MONGODB_URI: mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production
ä½ å¯ä»¥ä½¿ç¨ heroku config å½ä»¤ï¼é¨ææª¢æ¥é
ç½®è®é - ç«å³å試ï¼
>heroku config
=== limitless-tor-18923 Config Vars
MONGODB_URI: mongodb://your_user:your_password@ds139278.mlab.com:39278/local_library_production
NODE_ENV: production
Heroku æå¨æ´æ°è®éæï¼éæ°ååæç¨ç¨åºãå¦æä½ ç¾å¨æª¢æ¥ä¸»é ï¼å®æè©²é¡¯ç¤ºå°è±¡è¨æ¸çé¶å¼ï¼å çºä¸é¢çæ´æ¹ï¼æå³èæåç¾å¨æ£å¨ä½¿ç¨æ°çï¼ç©ºï¼æ¸æåº«ã
管çéå çµä»¶
Heroku 使ç¨ç¨ç«çéå çµä»¶ï¼çºæç¨ç¨åºæä¾æ¯ææå - ä¾å¦é»åéµä»¶ææ¸æåº«æåãæåä¸å¨æ¬ç¶²ç«ä¸ä½¿ç¨ä»»ä½æä»¶ï¼ä½å®åæ¯ä½¿ç¨ Heroku çéè¦é¨åï¼å æ¤ä½ å¯è½éè¦æ¥çä¸»é¡ - 管çæä»¶ï¼Heroku 宿¹æä»¶ï¼ã
é¤é¯
Heroku 客æ¶ç«¯æä¾äºä¸äºé¤é¯å·¥å ·ï¼
heroku logs # Show current logs
heroku logs --tail # Show current logs and keep updating with any new results
heroku ps #Display dyno status
總çµ
æ¬æç¨ä»ç´¹å¨çç¢ç°å¢ä¸ï¼å¦ä½é ç½® Express æç¨ãæ¯ Express ç³»åæç¨çæå¾ä¸åãæåå¸æä½ è¦ºå¾éäºæç¨æç¨ãä½ å¯ä»¥å¨ Github ä¸åå¾å®æ´çæºç¢¼ã
ç¸é鿥
-
Production best practices: performance and reliability (Express docs)
-
Production Best Practices: Security (Express docs)
-
Heroku
- Getting Started on Heroku with Node.js (Heroku docs)
- Deploying Node.js Applications on Heroku (Heroku docs)
- Heroku Node.js Support (Heroku docs)
- Optimizing Node.js Application Concurrency (Heroku docs)
- How Heroku works (Heroku docs)
- Dynos and the Dyno Manager (Heroku docs)
- Configuration and Config Vars (Heroku docs)
- Limits (Heroku docs)
-
Digital Ocean