摘要:先建個簡單的服務器當然你先得安裝使用,如果這里的代碼復制后運行不了請移步我的下載源碼順手給我個小星星鼓勵哈運行后訪問默認匹配的路由是,多個要使用方法,但是使用了,或者就不能使用到達下一個了是添加路由的方法,忽略大小寫,反斜杠,進行匹配時不
先建個簡單的服務器
當然你先得安裝express npm install express
//使用express,如果這里的代碼復制后運行不了請移步我的github下載源碼,順手star給我個小星星鼓勵哈 //http://github.com/sally2015/express-project // npm install 運行node main 后訪問loaclhost:3000 var express = require("express"); var app = express(); app.set("port", process.env.PORT || 3000); app.get("/",function(req, res){ res.send("home"); }); app.use("/about",function(req, res){ res.send("about"); }); app.use(function(req, res){ res.send("404"); }); app.use(function(req, res, next){ res.send("500"); }); app.listen(app.get("port"), function () { console.log("Express started on http:localhost"+app.get("port")); });
app.use(function(req,res,next){})默認匹配的路由是‘/’,多個use要使用next()方法,但是使用了,res.end()或者res.send()就不能使用next到達下一個use了
app.get()是添加路由的方法,忽略大小寫,反斜杠,進行匹配時不考慮查詢字符串
//不使用express你可能要這么寫 /* * var http = require("http"); * var server = http.createServer(function(req, res){ * if(req.url === "/"){ res.setHeader("Content-type","text-plain"); res.write("……");&&res.end(); * } *}).listen(3000,"localhost"); */
對定制的404頁面和500頁面的處理與對普通頁面的處理有所區別,用的不是app.get,而是app.use。app.use是express添加中間件的一種方法
express中路由和中間件的添加順序至關重要,如果把404處理器放在所有的路由上面,普通頁面的路由就不能用了
express能根據回調函數中的參數區分404和500處理器
使用handlebars(defaultLayout:"main")意味著除非你特別指明否則所有的視圖都是這個布局
var handlebars = require("express3-handlebars") //現在已經重命名為express-handlebar了,由于牽一發可能要動全身,我這里就不改了 .create({ defaultLayout: "main", // 設置默認布局為 }); app.engine("handlebars", handlebars.engine); // 將express模板引擎配置成handlebars app.set("view engine", "handlebars");
創建一個views/layouts/main.handlebars文件
Document
{{{body}}}
- {{{body}}}注意這里是三個大括號,這個表達式會被每個視圖自己的html取代 - 分別創建首頁、關于、404、500頁面,后綴名都是handlebars - ```html views/home.handlebars =>視圖和靜態文件welcome to home
views/about.handlebars =>welcome to about
views/404.handlebars =>not found - 404
views/500.handlebars =>500 server error
express靠中間件處理靜態文件和視圖,中間件是一種模塊化手段,使請求處理更加容易
static中間件可以將一個或多個目錄指派為包含靜態資源的目錄,其中的資源不經過特殊處理直接發送到客戶端
app.use(express.static(__dirname+"/public")); //現在所有文件都可以相對public直接進行訪問,例如public下面有一個img文 //件夾,那么在handlebars中(不需要理會在handlebars的目錄結構)直接訪問 //路徑/img/logo.png
視圖和靜態資源的區別是它不一定是靜態的,html可以動態構建
在項目下建一個public的子目錄,應該把static中間件加載所有路由之前
向handlebars里傳遞參數var args = "its a arguments";//虛擬一個參數 //修改此時的about路由 app.get("/about", function(req,res){ res.render("about", {args:args}); });
修改about文件
此時訪問就會得到下面的結果
以上代碼在https://github.com/sally2015/... ch1
---------------------------------------------分割線----------------------------------------------
ch2講講怎么快速、可維護的開發
使用自定義模塊ch1為了傳遞參數在main.js里面定義了一個虛擬數據,為了將數據分離出來,在根目錄下定義一個lib目錄,放置一個數據模塊m_data.js
var args = "its a arguments";//虛擬一個參數 exports.getData = function(){ return args; }
main.js
var m_data = require("./lib/m_data.js"); app.get("/about", function(req,res){ res.render("about", {args:m_data.getData()}); });使用nodemon自動重啟服務器
每次修改main文件都要ctrl+c停止再運行很累,使用nodeman每次修改都會幫我們重啟服務器
使用也非常簡單,npm install nodemon -g,運行nodemon main
頁面測試需要一個測試框架Mocha ---- npm install mocha --save-dev 這里dev的意思是只在開發時依賴
mocha是要運行在客戶端的所以把mocha資源放在public目錄下
public/vendor
=> node_modules/mocha/mocha.js
=> node_modules/mocha/mocha.css
測試通常需要一個assert函數
npm install chai --save-dev
node_modules/chai/chai.js => public/vendor
不讓測試一直運行
因為拖慢網站的速度,用戶也不需要看到測試結果
期望的情況是在url后面加上?test=1才加載測試頁面
定義中間件來檢測查詢字符串中的test=1,放在所有路由之前
如果test=1出現在任何頁面的字符串查詢中,屬性res.locals.showTests就會被設為true
res.locals對象是要傳給視圖上下文的一部分
app.use(function(req, res, next){ res.locals.showTests = app.get("env") !== "production" && req.query.test === "1"; next(); });引入測試框架
修改main.handlebars(以后簡寫main),修改head
Meadowlark Travel {{#if showTests}} {{/if}}
這里在head引入jquery是為了方便測試
在之前引入mocha和chai,還需引入一個qa/global-test.js腳本
{{#if showTests}} {{#if pageTestScript}} {{/if}} {{/if}}
創建public/qa/tests-global.js全局測試腳本
suite("Global Tests", function(){ test("page has a valid title", function(){ assert(document.title && document.title.match(/S/) && document.title.toUpperCase() !== "TODO"); }); });
訪問localhost:3000沒有任何變化,但是訪問localhost:3000?test=1,你會發現加載了測試的文件幫你做的這些東西
針對about頁面進行測試
這里假設測試確保有總有一個指向聯系我們頁面的鏈接,創建一個public/qa/tests-about.js
suite(""About" Page Tests", function(){ test("page should contain link to contact page", function(){ assert($("a[href="/contact"]").length); }); });
在main.js上改變路由/about的參數
app.get("/about", function(req,res){ res.render("about", { args:m_data.getData(), pageTestScript:"/qa/tests-about.js" }); });
現在刷新頁面about會有一個錯誤的斷言
只要about模板中有一個鏈接,這個錯誤測試斷言就會消失
例如contact us
使用局部組件
場景定義一個天氣組件,在任何頁面都可以調用,這樣的需要重復調用的可以用局部文件實現
新建一個views/partials/weather.handlebard
{{#each weather.locations}}{{/each}}{{name}}
{{weather}},{{temp}}
在weatherData.js中放入虛擬數據
function getWeatherData(){ return { locations:[ { name:"廣州", forecastUrl:"https://github.com/sally2015", weather:"廣州的溫度情況", temp:"溫度" }, { name:"深圳", forecastUrl:"https://github.com/sally2015", weather:"深圳的溫度情況", temp:"溫度" }, { name:"珠海", forecastUrl:"https://github.com/sally2015", weather:"珠海的溫度情況", temp:"溫度" } ] } } exports.getWeatherData = getWeatherData
創建一個中間件給res.locals.weather添加數據
//給res.locals.weather添加數據 app.use(function(req, res, next){ if(!res.locals.weather){ res.locals.weather = {}; } res.locals.weather = m_weatherData.getWeatherData(); next(); });
將組件放在主頁home上
welcome to home
{{>weather}}
語法{> partialname}可以讓你在視圖中包含一個局部文件,express-handlebars會在views/partials尋找
你可以將這個語法放在任何你需要的頁面上
客戶端使用模板和動態獲取數據客戶端使用handlebars需要加載handlebars文件,你可以從node_moudles里面找,像正常文件一樣引入即可
定義一個view/partials/ajaxtest.handlebars文件
在main.js中設定接口
app.get("/data/ajaxtest", function(req, res) { res.json({ animal:"dog", bodyPart:"tail", adjective : "sharp", noun : "run" }); });
在你想要的視圖里面加入{{>ajaxtest}}
這時候當你點擊按鈕就會請求到數據,注意接口使用的方法是json
--------------------分割線------------------------------------ch2 https://github.com/sally2015/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/80644.html
摘要:把文件上傳路徑指定到然后用當前日期和文件名命名上傳過來的文件。后端利用建立服務器,利用中間件指定文件路徑。利用這個前端和后端技術,我們基本上就可以做出一個圖片上傳存儲的基本網站核心。 前幾天看了騰訊云社區的一個文件上傳的文章文件上傳那些事兒,大體上講了以下h5中圖片上傳的幾個核心原理,但是沒有后端接受的服務器代碼,沒法做測試。也沒有具體的一個實例都是一些基本的原理片段,并且ui界面也不...
摘要:本項目持續更新中,開源免費與各位愛好技術達人共勉,注現階段仍在開發中。。。。。 NodeJS+Express+MongoDb開發的個人博客 NodeJS+Express搭建個人博客-環境搭建(一)NodeJS+Express搭建個人博客-gulp自動化構建工具使用(二)NodeJS+Express搭建個人博客-Express+Mongodb組合架構介紹(三)NodeJS+Express...
摘要:項目地址腳手架使用過,的同學都清楚,官方推薦的安裝方式是通過專用的來快速搭建一個由編譯打包的項目框架。用在層的模塊化,在中間層實現了模塊化。這樣,從中間層到前端都實現了熱加載。 版權聲明:更多文章請訪問我的個人站Keyon Y,轉載請注明出處。 項目地址:https://github.com/KeyonY/NodeMiddle 腳手架? 使用過angular2,vue2的同學都清楚,官...
摘要:在本文中,我們將借助天文圖庫,使用建立圖片庫。在使用虛擬機時,此處應為,命令將在目錄下運行。我們建議在選擇服務名時,盡量使用完整的類名。這樣,相當于告訴它必須使用指定的類來創建服務。在返回中的最后一個響應之前,應用會緩存該響應以備下次使用。 在本文中,我們將借助 NASA 天文圖庫 API,使用 Zend Expressive 建立圖片庫。最后的結果將顯示在 AstroSpla...
摘要:連接數據庫如果不自己創建默認數據庫會自動生成地址跟第一步的地址對應。現在回過頭來看里面的入口文件最后,我們在瀏覽器輸入,就會跳到。到此為止,我們就完成了整個前后端各自開發到正式部署的流程。 一個完整的網站服務架構包括:1、web frame ---這里應用express框架2、web server ---這里應用nodejs3、Database ---這里應用monggoDB4、...
閱讀 1158·2023-04-26 01:35
閱讀 2513·2021-11-02 14:44
閱讀 7642·2021-09-22 15:38
閱讀 2205·2021-09-06 15:11
閱讀 3720·2019-08-30 15:53
閱讀 795·2019-08-29 16:54
閱讀 631·2019-08-26 13:48
閱讀 1763·2019-08-26 13:47