若是你有 PHP 開發經驗,會習慣在修改 PHP 腳本後直接刷新瀏覽器以觀察結果,而你在開發 Node.js 實現的 HTTP 應用時會發現,不管你修改了代碼的哪一部份,都必須終止Node.js 再從新運行纔會奏效。這是由於Node.js 只有在第一次引用到某部份時纔會去解析腳本文件,之後都會直接訪問內存,避免重複載入,而 PHP 則老是從新讀取並解析腳本(若是沒有專門的優化配置)。Node.js的這種設計雖然有利於提升性能,卻不利於開發調試,由於咱們在開發過程當中老是但願修改後當即看到效果,而不是每次都要終止進程並重啓。supervisor 能夠幫助你實現這個功能,它會監視你對代碼的改動,並自動重啓 Node.js。node
使用方法很簡單,首先使用 npm 安裝 supervisor:express
$ npm install -g supervisor
若是你使用的是 Linux 或 Mac,直接鍵入上面的命令極可能會有權限錯誤。緣由是 npm須要把 supervisor 安裝到系統目錄,須要管理員受權,可使用 sudo npm install -g supervisor
命令來安裝。npm
接下來,使用 supervisor 命令啓動 app.js( 能夠視狀況更改,好比當前須要啓動:supervisor ./bin/www):ubuntu
$ supervisor app.js DEBUG: Running node-supervisor with DEBUG: program 'app.js' DEBUG: --watch '.' DEBUG: --extensions 'node|js' DEBUG: --exec 'node' DEBUG: Starting child process with 'node app.js' DEBUG: Watching directory '/home/byvoid/.' for changes. HTTP server is listening at port 3000.
當代碼被改動時,運行的腳本會被終止,而後從新啓動。在終端中顯示的結果以下:設計模式
DEBUG: crashing child DEBUG: Starting child process with 'node app.js' HTTP server is listening at port 3000.
supervisor 這個小工具能夠解決開發中的調試問題。瀏覽器
全局安裝express的時候( npm install -g express),使用express命令失效,有以下兩種緣由。服務器
安裝的express是4.0以上的版本,express在4.0以後,須要安裝the executable(執行器express-generator)才能執行express命令,app
解決方案:函數
安裝express-generator便可工具
npm install express-generator -g;
1)若是是用sudo apt-get install nodejs命令安裝的nodejs,ubuntu在安裝的時候爲了不包的衝突,將nodejs的命令操做改爲nodejs,而不是node。
2)因爲express安裝時默認的nodejs命令是node,因此安裝完後express命令會不起做用,本人的理解是express命令是在node名字的基礎上繼續其餘操做的:
eg. 它多是這樣的 node xxx, 而後在其它命令xxx 因而就組合成了express這一系列的操做,既然node命令都沒有用了 那麼express天然也就失去了原來的效果
解決方案:
1)若express的版本爲4.0以上
去 /usr/local/lib/node_modules/express-generator/bin 目錄,改express文件的第一行 ,以下:
#!/usr/bin/env nodejs
2)若express的版本爲4.0如下
去 /usr/local/lib/node_modules/express/bin 目錄,改express文件的第一行 ,以下:
#!/usr/bin/env nodejs
Express 支持同一路徑綁定多個路由響應函數,例如:
app.all('/user/:username', function(req, res) { res.send('all methods captured'); }); app.get('/user/:username', function(req, res) { res.send('user: ' + req.params.username); });
但當你訪問任何被這兩條一樣的規則匹配到的路徑時,會發現請求老是被前一條路由規則捕獲,後面的規則會被忽略。緣由是 Express 在處理路由規則時,會優先匹配先定義的路由規則,所以後面相同的規則被屏蔽。
Express 提供了路由控制權轉移的方法,即回調函數的第三個參數 next ,經過調用next() ,會將路由控制權轉移給後面的規則,例如:
app.all('/user/:username', function(req, res, next) { console.log('all methods captured'); next(); }); app.get('/user/:username', function(req, res) { res.send('user: ' + req.params.username); });
當訪問被匹配到的路徑時,如 http://localhost:3000/user/carbo,會發現終端中打印了 all methods captured ,並且瀏覽器中顯示了 user: carbo 。這說明請求先被第一條路由規則捕獲,完成 console.log 使用 next() 轉移控制權,又被第二條規則捕獲,向瀏覽器返回了信息。
<% code %> :JavaScript 代碼。
<%= code %> :顯示替換過 HTML 特殊字符的內容。(在routes的js文件中返回的內容)
<%- code %> :顯示原始 HTML 內容。
<%# code %> :註釋標籤,不執行,也沒有輸出。
<%%%>: 輸出字面的 '<%%>'
-%> :Trim-mode ('newline slurp') 標籤, 移除隨後的換行符
基本上的意思好像是說已經把headers傳遞給頁面了,因此不能再次設置它們。
出現的緣由:
在layout.ejs中,使用<%- body %>,表示這部份內容是各個模板文件獨有的。
在admin.ejs中,又一次使用<%- body %>,就會報錯
解決方式:
在admin.ejs中,刪掉<%- body %>。
也就是說,admin.ejs做爲/uses路由的默認模板,它實際上仍是要經過layout.ejs來進行統一渲染的。由於模板文件不是孤立展現的,默認狀況下全部的模板都繼承自 layout.ejs
GET:獲取POST:新增PUT:更新DELETE:刪除HEAD:請求指定資源的響應頭TRACE:回顯服務器收到的請求,主要用於測試或診斷CONNECT:HTTP/1.1 協議中預留給可以將鏈接改成管道方式的代理服務器。OPTIONS:返回服務器支持的HTTP請求方法。