精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Hackathon Starter:Node.JS Web開發腳手架

譯文
移動開發 Android
如果你以前參加過黑客馬拉松(hackathon),那么你一定會意識到項目準備階段會花費大量時間:比如決定制作什么、選擇編程語言、選擇web 框架,以及選擇css框架。一段時間過后,你好不容易在Github上建立起初始化的項目,然后其他成員才終于能夠開始工作。或者考慮一個更簡單的情景, 使用Facebook賬戶登錄。如果你不熟悉OAuth 2.0的話,這將耗費你大量的時間。

本文翻譯自Hackathon Starter的Github頁面

在線demo: http://hackathonstarter.herokuapp.com

本文翻譯時Hackathon Starter的version:2.3.2

Hackathon Starter是專門為Node.JS Web開發而準備的一個樣板。

如果你以前參加過黑客馬拉松(hackathon),那么你一定會意識到項目準備階段會花費大量時間:比如決定制作什么、選擇編程語言、選擇web 框架,以及選擇css框架。一段時間過后,你好不容易在Github上建立起初始化的項目,然后其他成員才終于能夠開始工作。或者考慮一個更簡單的情景, 使用Facebook賬戶登錄。如果你不熟悉OAuth 2.0的話,這將耗費你大量的時間。

當我開始本項目時,我首要考慮的是簡單易用。我也試著讓它盡量的兼容以及可復用,使它能夠在大多數hackathon web app上使用。在最壞的情況,比如你只對使用Google賬戶登錄感興趣,你也可以將它當做一個學習指南。

你很可能不需要使用所有的賬號登錄認證功能,不用擔心,這些在Hackathon Starter 2.1版本之后是可選擇的。

現代風格

扁平化Bootstrap主題

默認主題

Hackathon Starter生成器界面

特性

  • 本地登錄認證(使用Email與密碼)
  • OAuth 1.0a認證( Twitter)
  • OAuth 2.0認證(Facebook、Google、Github、Linkedin等)
  • 快速提示
  • MVC項目結構
  • Node.JS 集群支持
  • Rails 3.1風格的 Asset pipeline,由connect-assets提供
  • LESS樣式表(自動編譯無需Gulp/Grunt)
  • Bootstrap 3 + Flat UI + iOS 7
  • 聯系表單(支持Mailgun、Sendgrid、Mandrill)
  • 賬戶管理
    Gravatar頭像
    用戶詳細資料
    改密碼
    找回密碼
    重置密碼
    綁定社交賬號
    注銷賬號
  • CSRF保護
  • API案例(Facebook等)

環境依賴

  • MongoDB
  • Node.JS
  • 命令行工具
    Mac OS X:Xcode
    Windows:Visual Studio
    Ubuntu:sudo apt-get install build-essential
    Fedora:sudo yum groupinstall "Development Tools"
    OpenSUSE:sudo zypper install --type pattern devel_basis

注意:如果你是Node.JS新手,建議閱讀教程Getting Started With Node.js, Express, MongoDB

入門指南

最簡單的開始方法就是克隆Github倉庫:

# Get the latest snapshot
git clone --depth=1 https://github.com/sahat/hackathon-starter.git myproject

cd myproject

# Install NPM dependencies
npm install

node app.js

注意:強烈建議安裝Nodemon,它能監控你的Node.JS App的任何改動并自動重啟,從長遠來看著將節省你大量時間。

生成器(Generator)

Hackathon Starter生成器目前還在實驗階段,它與目前的代碼緊密相連,一旦移動或改變項目代碼,生成器將有可能不可用,因此建議在下載HS后第一時間使用。

生成器能夠選擇賬號認證、改變發送郵件的服務商。

獲得API密鑰(略過)

本部分講如何從Facebook、Google等服務提供商處獲取API密鑰。

項目結構

Name Description
config/passport.js 本地與OAuth的賬號認證策略,包括登錄
config/secrets.js API密鑰、密碼、數據庫地址等
controllers/api.js /api 路由控制器,包括所有api示例
controllers/contact.js 聯系表單的控制器
controllers/home.js 主頁(index)的控制器
controllers/user.js 用戶賬號管理的控制器
models/User.js Mongoose中用戶的schema與model
public/ 靜態資源 (fonts, css, js, img)
public/js/application.js 指定客戶端JS依賴
public/js/main.js 你所編寫的客戶端JS
public/css/styles.less 你的App的主樣式表
public/css/themes/default.less 一些Bootstrap默認樣式
views/account/ 賬號管理模板
views/api/ API示例模板
views/partials/flash.jade 錯誤、信息與成功的提示
views/partials/navigation.jade 導航欄部分的模板
views/partials/footer.jade Footer部分的模板
views/layout.jade 基礎模板
views/home.jade 主頁模板
app.js 主要的App文件
setup.js 移除賬號認證等的工具

注意:這里沒有規定你應該如何處理你的視圖,你可以將你的視圖模板放在你喜歡的地方,只要記住更新extends ../layout并且與控制器中的res.render()路徑一致。

使用包列表

Package Description
async 提供同步控制流的工具庫
bcrypt-Node.JS 哈希并鹽化用戶密碼的庫
cheerio 提供服務器端處理web頁面能力的庫
clockwork Clockwork SMS API庫
connect-assets 處理和編譯LESS樣式和JS文件的工具
connect-mongo MongoDB連接Express的庫
csso connect-assets庫的依賴
express Node.js web框架
body-parser Express 4.0 中間件
cookie-parser Express 4.0 中間件
express-session Express 4.0 中間件
morgan Express 4.0 中間件
compression Express 4.0 中間件
errorhandler Express 4.0 中間件
method-override Express 4.0 中間件
express-flash 提供Express的快速提示
express-validator Express的簡單表單驗證
fbgraph Facebook Graph API 庫
github-api GitHub API 庫
jade Express的模板引擎
lastfm Last.fm API 庫
instagram-node Instagram API 庫
less LESS編譯器. 在connect-assets中使用.
lusca CSRF 中間件
mongoose MongoDB ODM.
node-foursquare Foursquare API 庫
node-linkedin LinkedIn API 庫
nodemailer Node.js發送郵件的庫
passport node.js簡單優雅的賬號認證庫
passport-facebook Sign-in with Facebook 插件
passport-github Sign-in with GitHub 插件
passport-google-oauth Sign-in with Google 插件
passport-twitter Sign-in with Twitter 插件
passport-instagram Sign-in with Instagram 插件
passport-local 本地登錄的插件
passport-linkedin-oauth2 Sign-in with LinkedIn 插件
passport-oauth 設定你自己的OAuth1.0a與OAuth2.0策略
request 簡化的HTTP請求庫
stripe 官方 Stripe API 庫
tumblr.js Tumblr API 庫
twilio Twilio API 庫
twit Twitter API 庫
lodash 方便的JS工具庫
uglify-js connect-assets的依賴
validator 在 controllers/api.js中與express-validator聯合使用
mocha 測試框架
chai BDD/TDD 聲明庫
supertest HTTP 聲明庫
multiline 生成器使用的Multi-line 字符串
blessed 生成器使用的互動式命令行界面
yui Yahoo API 示例中使用

有用的工具與資源

推薦的設計資源

推薦的Node.JS庫

  • Nodemon – 代碼改動時自動重啟Node.js服務
  • geoip-lite – 根據IP地址庫的地理位置定位
  • Filesize.js – 格式化文件大小,如 filesize(265318); // "265.32 kB".
  • Numeral.js – 格式化并操作數字的庫
  • Node Inspector – 基于Chrome開發者工具的Node.js調試器
  • node-taglib – 讀取常用音頻格式的meta-data的庫
  • sharp – 調整圖片大小的庫,支持JPEG, PNG, WebP 和 TIFF

推薦的客戶端JS庫

  • Framework7 – 包含構建iOS7風格App完整特性的HTML框架
  • InstantClick – 在鼠標指上時預下載,加快頁面加載速度
  • NProgress.js – 簡練的進度顯示條
  • Hover – 非常棒的鼠標hover css3動畫效果
  • Magnific Popup – 響應式的jQuery彈出框插件
  • jQuery Raty – 星星打分插件
  • Headroom.js – 隱藏你的header直到你需要它
  • X-editable – 直觀的修改表單元素
  • Offline.js – 探測用戶是否在線
  • Alertify.js – 可愛的彈出警告與瀏覽器對話框
  • selectize.js – 可調整樣式的select元素與input標簽
  • drop.js – 強大的JS與CSS庫用于創建下拉菜單與其他浮動顯示層
  • scrollReveal.js – 提供滾動時的動畫效果

高級Tips

  1. 當安裝NPM包時,添加–save標簽,它將自動添加到package.json文件中。如:npm install –save moment
  2. 當你需要多個同步工作,并當它們都完成后才渲染頁面時,使用async.parallel() 。比如你需要爬取三個頁面的數據,爬取完成后將結果填充到模板中。
  3. 想要從隊列中尋找特定的對象?試試Lodash里的_.find 函數。比如,這段代碼提供了檢索Twitter token的能力:
  1. var token = _.find(req.user.tokens, { kind: 'twitter' }); 

FAQ

為什么我在提交表單時顯示403錯誤?

你需要在表單中添加下面的隱藏元素,這是一項CSRF保護措施。

  1. input(type='hidden'name='_csrf'value=_csrf

注意:CSRF現在支持白名單了,這意味著你可以提交一些URL鏈接,他們可以被CSRF忽略。

注意2:如需忽略的URL是動態的,可以用正則表達式匹配。

cluster_app.js是什么?

Node.js官方文檔的解釋

一個Node實例在單個線程中運行。為了充分利用多內核系統的性能,用戶會希望啟動一個Node的進程簇來處理負載。cluster模塊讓你能夠簡單創建共享服務器端口的子進程。

cluster_app.js是app.js的多進程版本,它能為每個被探測到的CPU創建一個進程。為了最大化的滿足HTTP請求,這是一個很好的功能。但是,cluster模塊仍處於實驗階段,因此請小心使用,確保你正確理解了它的意圖和行為。要使用它,只需要運行node cluster_app.js,它與app.js是完全分離的,無任何依賴關系。需要提醒的是,如果你用cluster_app.js替代app.js,你需要在package.json里做出聲明。

什么是Rails 3.1風格的asset pipeline?

下面是你如何在HTML里定義靜態文件,使用Jade或其他的模板引擎:

  1. link(href='/css/styles.css'rel='stylesheet'
  2. script(src='/js/lib/jquery-2.1.0.min.js'
  3. script(src='/js/lib/bootstrap.min.js'
  4. script(src='/js/main.js'

看起來足夠簡單?在開發環境下也行是這樣。但如果當你將app部署到生產環境時,它們能夠被自動的壓縮到單個的文件呢?

  1. link(href='/css/styles.css'rel='stylesheet'
  2. script(src='/js/application.js'

當你引入的JS庫越多,自動連接并壓縮JS文件帶來的好處就越大。connect-assets庫能夠讓你簡單的完成這一操作,只需兩行代碼:

  1. != css('styles')      // expects public/css/styles.less 
  2. != js('application')  // expects public/js/application.js 

你只需要記住在public/js/application.js中定義你的JS文件。語法從Rails中借鑒而來:

  1. //= require lib/jquery-2.1.0.min 
  2. //= require lib/bootstrap.min 
  3. //= require main 

使用這個方法,當在開發模式時,它會加載各個獨立的JS文件,而當部署到生產環境,它會自動形成單個JS文件。你可以看Sprockets-style concatenation 來了解更多。

我出現了MongoDB Connection Error,該如何修復它?

這是一個在app.js中自定義的錯誤信息,用來表示連接到MongoDB時出現了問題。

  1. mongoose.connection.on('error', function() { 
  2.   console.error('✗ MongoDB Connection Error. Please make sure MongoDB is running.'); 
  3. }); 

它提示你應該在啟動app.js之前先啟動MongoDB,你可以在這里下載MongoDB,也可以從包管理器來安裝,如果你是Windows用戶,可以按照在Windows上安裝MongoDB的說明來做。

Tip:如果你一直連接著網絡,也可以試著使用 MongoLab 或者 MongoHQ 等在線數據庫服務,你只需要更新config/secrets.js中的db信息。

當我部署我的app時提示錯誤,為什么?

有可能是你沒有在secrets.js中正確的設置數據庫路徑。當你在本地運行你的app時,數據庫路徑是localhost,但當你部署app時,你需要在網上找到一個運行的MongoDB,并將連接地址正確的填寫在secrets.js中。你也可以申請MongoLab 或者 MongoHQ 等免費服務。

為什么采用Jade代替Handlebars模板引擎?

當我開始這個項目的時候我并不熟悉Handlebars,后來我開發了一些Ember.js apps并且熟悉了Handlebars的語法。Handlebars的確更簡單一些,因為它就像HTML一樣,但我并不后悔選擇了Jade。理由有三, 第一因為Jade是Express的默認模板引擎,所以以前開發過Express應用的人已經對它很熟悉了;第二,我發現在Handlebars里 extends和block是必不可少的,它實際上并沒有達到即開即用的程度,你仍然需要編寫一些擴展函數;第三,客觀的說,Jade看上去比 Handlebars更簡潔干凈,這點與其他非HAML風格的引擎相比也是一樣。

為什么你在app.js里定義了所有的路由(route)?

一言以蔽之,為了簡潔。也許有其他更好的方法,比如在這篇博文中 將app上下文按照概述傳給每一個控制器,但我發現這種方法對初學者來說說容易搞混的。我花了大量時間來理解exports和 module.exports的概念,保證有一個單獨的全局性app文件作為參考。這是我的背景想法。app.js對我來說是“app的心臟”,它應該成 為其他所有模型、控制器、路由等的參考。

我不需要一個絕對底部(sticky footer),我能刪除它嗎?

當然可以。不過不像一個常規footer,你還需要做一些額外的工作。首先,從styles.less里刪除#wrap#footer,以及html, body { height: 100%; }。然后,從layout.jade中刪除#wrap#footer所在的行(順便說下,如果Jade沒有檢測到class或id,它會默認其是一個div元素)。不要忘了調整#wrap下面的縮進,本項目使用兩個空格表示塊級縮進。

我能夠使用Sass代替LESS嗎?

Yes you can!雖然你需要手動的轉換現有的樣式表到Sass,考慮到Sass和LESS的相似程度,這不會太難。然后你只需要重命名styles.less為styles.scss,connect-assets會自動的采用Sass預處理器。

你甚至可以同時的使用Sass和LESS,在layout.jade里分別指定了LESS和Sass樣式表文件:

  1. != css('styles') # public/css/styles.less 
  2. != css('my_sass_styles') # public/css/my_sass_styles.scss 

注意:項目的package.json不包含Sass,所以你需要自己安裝它,使用以下命令:

  1. npm install --save node-sass 

迷你指南

這一部分將提供單一特定功能的細節解釋。也許你很好奇這個項目是如何工作的,也許你已經迷失在代碼當中,我希望它能給你一些指引。

定制HTML與CSS設計入門

HTML5 UP提供許多漂亮的模板,并且可以免費下載。

當你下載了一個zip文件,里面有index.html、images、css和js文件夾。那么,如何把它拿到Hackathon Starter里面來呢?Hackathon Starter使用Bootstrap CSS框架,但那些模板沒有使用。將它們放到一起會出現很多意想不到的情況。

注意:使用定制模板的方法,你應當理解你不能重用我創建的所有視圖:layout、主頁、登錄、注冊、賬號管理、聯系頁面。這些視圖使用 Bootstrap柵格風格創建。你需要用新模板里的語法手動更新這些柵格。不過你也可以用另一種方法,在大多數界面使用Bootstrap,而在 landing page使用另一種風格的模板。

讓我們從頭開始,在這個例子里我將使用Escape Velocity 模板。

注意:為了簡潔起見我將只考慮index.html,忽略left-sidebar.html、 no-sidebar.html和 right-sidebar.html。

將所有的js文件從html5up-escape-velocity/js移動到public/js,并將所有css文件從html5up- escape-velocity/css移動到public/css,最后將所有圖片文件從html5up-escape-velocity /images移動到public/images,復制index.html里的代碼,并將它們粘貼到HTML To Jade 進行轉換。

創建一個新文件escape-velocity.jade,將轉換到的Jade代碼粘貼進去。將!!! 5修改為doctype html,這是Jade最近的一個改動之一,但是http://html2jade.aaron-powell.com 還沒有跟進這個改動。

在controllers/home.js里創建一個新的控制器escapeVelocity:

  1. exports.escapeVelocity = function(req, res) { 
  2.   res.render('escape-velocity', { 
  3.     title: 'Landing Page' 
  4.   }); 
  5. }; 

然后在app.js里創建一個路由,我將它放在index控制器的后面::

  1. app.get('/escape-velocity', homeController.escapeVelocity); 

重啟服務器(如果你沒有使用nodemon),然后你就可以在http://localhost:3000/escape-velocity 來查看新模板了。

我的講解將在這里打住,如果你想在更多的頁面使用這個模板,下面是你需要關注的Jade文件:

  • layout.jade – 基本模板
  • index.jade – 主頁
  • partials/navigation.jade – Bootstrap導航欄
  • partials/footer.jade – 絕對底部(sticky footer)

你需要手動的將新模板分解為更小的部分。弄清楚模板的哪些部分你想在所有的頁面中保留——那將是你的新layout.jade,其他頁面將通過 block content來共享代碼。如果有不清楚的地方,你可以使用已有的模板作為參考。

這是一個枯燥無味的過程,如果你下載的模板有一套新的柵格系統,那么需要更加謹慎了。這是我為什么使用Bootstrap的原因。很多人已經熟悉Bootstrap了,即使沒用過學起來也很簡單。你還可以從Themeforest購買一些漂亮的Bootstrap模板。然后你可以很方便的將它放到Hackathon Starter里。如果你需要完全的定制HTML與CSS,上面這些內容將幫助你。

快速提示是如何工作的?

快速提示(Flash messages)允許你在一個請求的結尾,以及當且僅當下一個請求之前顯示一段信息。比如,當登錄失敗時,你可以輸出一些警告信息,但一旦刷新頁面或者 再次進入登錄頁面后,這個警告信息不應該再次出現,它只會被顯示一次。本項目使用express-flash模塊來顯示快速提示,這個模塊在我創建 Hackathon Starter項目時就被包含在connect-flash里面。有了express-flash你無需發送快速提示到每一個視圖,它一開始就是可用的, 感謝express-flash。

使用快速提示需要兩個步驟。使用下面的代碼在你的控制器里創建一個快速提示:

  1. req.flash('errors', { msg: 'Error messages goes here' } 

然后在你的視圖里顯示它們:

  1. if messages.errors 
  2.   .alert.alert-danger.fade.in 
  3.     for error in messages.errors 
  4.       diverror.msg 

在第一步里,'errors'是你定義的快速提示的名稱,它應該和你的視圖里的messages里的屬性名稱相匹配。將警告信息放在if message.errors以讓它們出錯時才顯示。錯誤信息采用{ msg: 'Error messages goes here' }的形式而不是像'Error messages goes here'一樣的字符串是為了一致性。express-validator模塊會驗證用戶的輸入,當發生錯誤時返回一個數組對象,每個對象都含有一個msg屬性。下面是express-validator所返回信息的一個示例:

  1.   { param: "name", msg: "Name is required", value: "<received input>" }, 
  2.   { param: "email", msg: "A valid email is required", value: "<received input>" } 

如果使用字符串,你會發現信息框里面是空的。上面的錯誤信息也可以應用在info或者success的場合。

partials/flash.jade是控制快速提示格式化顯示的子模板。它使用一個叫做DRY的方法,將散落在各個視圖的快速提示歸到一處。

和導航欄與footer子模板一樣,flash子模板被包含在layout.jade里。

  1. body 
  2.   #wrap 
  3.     include partials/navigation 
  4.     .container 
  5.       include partials/flash 
  6.       block content 
  7.   include partials/footer 

如何創建一個新頁面?

更正確的說法應該是“如何創建一個新路由”。主文件app.js包含所有的路由,每一個路由都伴隨著一個callback函數,你會在某些路由里發 現3個以上的參數,在這種情況里,第一個參數仍然是URL字符串,中間的參數是中間件,你可以將它們想象成門禁,如果它阻止你前進,你將不能得到 callback函數。一個例子是需要認證的路由:

  1. app.get('/account', passportConf.isAuthenticated, userController.getAccount); 

它的順序總是從左到右。當用戶訪問/account頁面,isAuthenticated中間件將檢查用戶是否認證:

  1. exports.isAuthenticated = function(req, res, next) { 
  2.   if (req.isAuthenticated()) { 
  3.     return next(); 
  4.   } 
  5.   res.redirect('/login'); 
  6. }; 

如果認證檢查通過,你通過呼叫return next()的方式讓用戶通過門禁。它會依次通過剩下的中間件直到最后一個參數,即callback函數,它通常在接受到GET請求時渲染頁面,或在收到 POST請求時跳轉頁面。在這個例子里,你將被跳轉到用戶賬號管理頁面,如果認證沒有通過,你將被跳轉到登錄頁面。

  1. exports.getAccount = function(req, res) { 
  2.   res.render('account/profile', { 
  3.     title: 'Account Management' 
  4.   }); 
  5. }; 

Express.js里有app.get、app.post、app.put、app.delete四種HTTP動作。但在大多數情況你只需要前兩種,除非你想創建一個RESTful API。如果你只想顯示一個頁面,使用GET,如果你想提交表單,使用POST。

下面是一個添加路由到你的app里的典型工作流。我們的目的是創建一個頁面顯示數據庫里的書籍列表。

第一步:定義一個路由。

  1. app.get('/books', bookController.getBooks); 

在express 4.0以上你可以這樣定義你的路由:

  1. app.route('/books') 
  2.   .get(bookController.getBooks) 
  3.   .post(bookController.createBooks) 
  4.   .put(bookController.updateBooks) 
  5.   .delete(bookController.deleteBooks) 

而下面是一個需要認證中間件的路由:

  1. app.route('/api/twitter') 
  2.   .all(passportConf.isAuthenticated) 
  3.   .all(passportConf.isAuthorized) 
  4.   .get(apiController.getTwitter); 
  5.   .post(apiController.postTwitter) 

上面三種方式都是可接受的,你可以使用它們中的任何一種。我認為app.route里HTTP動詞的這種鏈式寫法非常干凈優雅,不過缺點是當每個路由占一行的時候,你不能一眼看到所有的動作。

第二步:創建一個叫book.js的新控制器文件。

  1. /** 
  2.  * GET /books 
  3.  * List all books. 
  4.  */ 
  5.  
  6. exports.getBooks = function(req, res) { 
  7.   Book.find(function(err, docs) { 
  8.     res.render('books', { books: docs }); 
  9.   }); 
  10. }; 

第三步:將控制器加入到app.js里。

  1. var bookController = require('./controllers/book'); 

第四步:創建book.jade模板。

  1. extends layout 
  2.  
  3. block content 
  4.   .page-header 
  5.     h3 All Books 
  6.  
  7.   ul 
  8.     for book in books 
  9.       libook.name 

到這里就完成了。

當然,你可以將1到3步合在一起放到app.js里:

  1. app.get('/books', function(req, res) { 
  2.   Book.find(function(err, docs) { 
  3.     res.render('books', { books: docs }); 
  4.   }); 
  5. }); 

是的,這樣更簡單些,但當你在app.js中加入1000行代碼時,瀏覽起來會變得比較麻煩。這個項目的初衷本來就是為了分解關注點,這樣你可以與你的隊員一起工作而不是忙碌于解決沖突。

上面的內容就是一切了,Express.js非常易于使用。大部分時間其實用在處理其他API,讓它們來干真正的工作,比如查詢數據庫的Mongoose,使用websocket收發信息的socket.io,發送郵件的 Nodemailer,表單驗證的express-validator 庫,以及處理web頁面的Cheerio 等。

如何在Hackathon Starter里使用Socket.io?

Dan Stroot曾提交了一個非常棒的pull以在Hackathon Starter里添加一個實時的儀表盤。但我認為它違反了非特定化的原則,因此并未接受。但你仍然可以在Hackathon Starter里使用Socket.io。下面是一般的操作步驟。

  1. npm install socket.io --save 

var app = express();替換為下面的代碼:

  1. var app = express(); 
  2. var http = require('http'); 
  3. var server = http.createServer(app); 
  4. var io = require('socket.io').listen(server); 

將下面的代碼添加到app.js的末尾:

  1. io.configure(function() { 
  2.   io.set('transports', ['websocket']); 
  3. }); 
  4.  
  5. io.sockets.on('connection', function(socket) { 
  6.   socket.emit('greet', { hello: 'Hey, Mr.Client!' }); 
  7.   socket.on('respond', function(data) { 
  8.     console.log(data); 
  9.   }); 
  10.   socket.on('disconnect', function() { 
  11.     console.log('Socket disconnected'); 
  12.   }); 
  13. }); 

最后,將

  1. app.listen(app.get('port'), function() { 

改為

  1. server.listen(app.get('port'), function() { 

后端的工作到這里就完成了。

你有兩種方式將前端部分的js加到app中,一種是直接加到layout.jade中,將下面的代碼加到head塊中。

  1. script(src='/socket.io/socket.io.js'
  2. script. 
  3.     var socket = io.connect(window.location.href); 
  4.     socket.on('greet', function (data) { 
  5.       console.log(data); 
  6.       socket.emit('respond', { message: 'Hello to you too, Mr.Server!' }); 
  7.     }); 

注意代碼中socket.io的路徑,你并不需要實際的在項目中包含socket.io.js,它將在運行時自動生成。

另一種方法是將js部分加入到獨立的的main.js文件中,并將它們包含在jQuery的ready函數下。

  1. $(document).ready(function() { 
  2.  
  3.   // Place JavaScript code here... 
  4.   var socket = io.connect(window.location.href); 
  5.   socket.on('greet', function (data) { 
  6.     console.log(data); 
  7.     socket.emit('respond', { message: 'Hello to you too, Mr.Server!' }); 
  8.   }); 
  9.  
  10. }); 

到這里所有工作就完成了。

這里有一個實時儀表盤的在線演示。你可以查看這里它是如何添加到工程里的。

Mongoose Cheatsheet

查詢所有用戶:

  1. User.find(function(err, users) { 
  2.   console.log(users); 
  3. }); 

通過email查詢用戶:

  1. var userEmail = 'example@gmail.com'
  2. User.findOne({ email: userEmail }, function(err, user) { 
  3.   console.log(user); 
  4. }); 

查詢5個最近的用戶賬號:

  1. User 
  2.   .find() 
  3.   .sort({ _id: -1 }) 
  4.   .limit(5) 
  5.   .exec(function(err, users) { 
  6.     console.log(users); 
  7.   }); 

從所有文檔中查詢指定列的總數:

假設每個用戶有一個叫做votes的列,你希望統計所有用戶的votes總數。一個笨辦法是循環查找所有的文檔并手動的將結果加起來。另一個方法是使用MongoDB Aggregation Framework 來代替:

  1. User.aggregate({ $group: { _id: null, total: { $sum: '$votes' } } }, function(err, votesCount) { 
  2.   console.log(votesCount.total); 
  3. }); 

應用部署(略過)

本部分介紹了應用MongoLab、Heroku、OpenShift等在線服務來部署應用,由于網絡環境的不同,在國內可能難以用到,所以不予翻譯。

(正文完)

譯者注:翻譯完成后覺得Hackathon Starter的確是個好東西,不過就像這篇文章所說的,每個開發者都需要有自己的Project Starter,這個Hackathon Starter也不適合直接拿來用,吃透它,將它本地化才是最好的做法。

責任編輯:閆佳明 來源: 51CTO譯文
相關推薦

2018-08-30 16:08:37

Node.js腳手架工具

2018-06-11 14:39:57

前端腳手架工具node.js

2019-11-07 09:20:42

Node.js項目服務器

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2021-01-07 05:34:07

腳手架JDK緩存

2019-08-29 10:58:02

Web 開發框架

2019-08-05 09:45:19

Node.jsWeb開發前端

2012-03-07 14:32:41

Node.js

2017-07-21 09:56:46

Webpack3 Vue.js腳手架

2025-05-26 08:45:00

AvueVue.js前端

2017-11-29 14:48:01

Node.JSRails語言

2013-11-01 09:34:56

Node.js技術

2012-09-29 11:13:15

Node.JS前端開發Node.js打包

2016-09-07 15:35:06

VueReact腳手架

2025-05-16 07:24:41

Springkafka腳手架

2021-12-23 10:35:32

SpringCloud腳手架架構

2021-04-28 16:10:48

開發腳手架 Spring

2019-02-15 10:49:37

Node.jsweb服務器

2011-11-01 10:30:36

Node.js

2011-09-08 13:46:14

node.js
點贊
收藏

51CTO技術棧公眾號

国产精品成人在线观看| 日韩av一区二区三区四区| 日韩片之四级片| 亚洲欧洲在线视频| 日韩福利视频在线| 亚洲成人777777| 欧美高清视频在线观看mv| 91麻豆精品久久久久蜜臀| 成人在线国产视频| 在线观看完整版免费| 一区二区毛片| 色悠悠久久久久| 久久久久久婷婷| av在线日韩| 亚洲一二三专区| 午夜精品美女久久久久av福利| a在线观看视频| 丝袜亚洲另类丝袜在线| 欧美成人在线影院| 一级黄色录像毛片| 六月丁香久久丫| 91精品国产91久久久久久最新毛片| 黄色网页免费在线观看| av网站免费在线观看| 国产欧美精品区一区二区三区| av资源站久久亚洲| 一本大道伊人av久久综合| 国产精品亚洲综合久久| 91精品国产aⅴ一区二区| 久久久久免费看黄a片app| 麻豆传媒在线完整视频| 国产亚洲精品bt天堂精选| 国产美女精品在线观看| 国产精品一级视频| 国产精品久久久久久久免费观看| 日韩精品在线私人| 动漫av在线免费观看| 久久亚洲国产精品尤物| 在线视频国内一区二区| 国产午夜伦鲁鲁| 九色91在线| 亚洲激情自拍偷拍| japanese在线视频| 成人激情四射网| 国产精品va| 久久五月天综合| 熟女少妇a性色生活片毛片| 九一国产精品| 亚洲人午夜精品| 成年人网站免费看| 校花撩起jk露出白色内裤国产精品| 日韩欧美一区二区久久婷婷| 亚洲天堂一区二区在线观看| 日韩精品一级毛片在线播放| 欧美性高清videossexo| 国产精品第12页| 欧美日韩国产v| 在线免费观看不卡av| 色综合av综合无码综合网站| 欧美aa在线观看| 欧美性xxxx| 99久久国产宗和精品1上映| 69久成人做爰电影| 色94色欧美sute亚洲13| 久久久久免费精品| 国产91欧美| 欧美福利视频一区| 中国特级黄色片| 加勒比中文字幕精品| 日韩hd视频在线观看| 四虎影成人精品a片| 国产精品入口久久| 日韩中文娱乐网| 久久久久久久久毛片| 欧美日韩一区二区高清| 亚洲乱码一区av黑人高潮 | 免费在线观看不卡| 国产啪精品视频| 国产黄色片免费| 97精品国产露脸对白| 欧洲精品久久| а√天堂官网中文在线| 亚洲不卡av一区二区三区| 97超碰青青草| 久久夜夜久久| 精品av久久707| 人人人妻人人澡人人爽欧美一区| 精品日本12videosex| 欧美成人在线免费视频| 色av性av丰满av| 国内久久精品视频| 久久99久久99精品蜜柚传媒| 啊v视频在线| 99综合电影在线视频| 欧美日韩在线观看一区| 永久av在线| 精品久久久久久中文字幕大豆网| 日本激情视频在线| 99亚洲乱人伦aⅴ精品| 欧美一区二区三区在线| 国产精品久久久久久亚洲av| 国产精品一区高清| 欧美高清激情视频| 中文字幕制服诱惑| av午夜精品一区二区三区| 亚洲一一在线| 欧洲一区精品| 日韩限制级电影在线观看| mm131美女视频| 欧美激情视频一区二区三区在线播放| 欧美在线一区二区视频| 国产ts人妖调教重口男| 国产日韩v精品一区二区| 国产精品一色哟哟| 日韩一级特黄| 亚洲一区二区黄| 国产精品23p| 精品在线视频一区| 91老司机精品视频| 黄色大片在线看| 午夜在线成人av| 日本一区二区三区在线免费观看| 蜜桃视频欧美| 久久久久久成人精品| 国产裸体无遮挡| 国产精品久久久久久久第一福利| 成人在线免费观看av| 中文在线免费一区三区| 麻豆国产精品va在线观看不卡| 麻豆精品久久久久久久99蜜桃| 成人国产精品免费观看动漫| 国产精品日韩高清| 黄色网页在线播放| 欧美日韩一级大片网址| 中文字幕第24页| 国产伦一区二区三区| 午夜精品美女自拍福到在线| 国产成年妇视频| 亚洲视频免费看| 在线观看国产福利| 91蜜臀精品国产自偷在线| 国产精品xxxxx| 国产精品一二三区视频| 一本色道a无线码一区v| 色婷婷av777| 久久久xxx| 欧美日韩一区在线播放| 成人软件在线观看| 国产午夜精品一区理论片飘花| 日本中文字幕第一页| 91在线观看污| 欧美极品欧美精品欧美图片| 青青操综合网| 日韩美女在线看| 国产精品免费播放| 欧美私模裸体表演在线观看| 中国特黄一级片| 久久国产精品72免费观看| 亚洲一区三区在线观看| 91成人精品观看| 欧美日本中文字幕| 国产综合在线播放| 欧美日韩在线影院| 日本黄色小视频在线观看| 日韩电影免费在线看| 亚洲午夜精品福利| 日本一区二区乱| 欧美激情欧美激情在线五月| 天堂网在线播放| 在线免费不卡电影| 亚洲最大的黄色网址| 国产精品夜夜嗨| 亚洲国产精品无码观看久久| 日韩精选在线| 国产噜噜噜噜噜久久久久久久久| 美女免费久久| 亚洲成人在线视频播放| 免费看毛片网站| 亚洲欧洲国产日本综合| 熟妇女人妻丰满少妇中文字幕 | www.欧美黄色| 精品一区欧美| 91精品视频在线| 日本а中文在线天堂| 国产一区二区三区在线播放免费观看 | 99久久.com| 国产精品毛片一区视频| 粉嫩一区二区三区| 欧美精品在线视频观看| 男人天堂综合| 欧美一区二区啪啪| 亚洲欧美一区二区三区在线观看| 国产精品麻豆99久久久久久| 久久av一区二区三| 一二三区精品| 欧美 日韩 国产 在线观看| 开心激情综合| 91免费在线视频| 亚洲小少妇裸体bbw| 久久精品国产清自在天天线| 色欲av永久无码精品无码蜜桃| 在线观看一区二区视频| 久久久久久蜜桃| 国产精品免费视频网站| 大乳护士喂奶hd| 精品无人区卡一卡二卡三乱码免费卡 | 欧美日韩免费区域视频在线观看| 欧日韩不卡视频| 91偷拍与自偷拍精品| 潘金莲一级淫片aaaaa免费看| 亚欧洲精品视频在线观看| 91中文精品字幕在线视频| 在线观看免费网站黄| 日韩高清中文字幕| 国产黄色av网站| 精品视频全国免费看| 日韩av在线天堂| 亚洲精品一卡二卡| 色www亚洲国产阿娇yao| 久久精品在线免费观看| 国模私拍在线观看| 国产另类ts人妖一区二区| 视色视频在线观看| 久久激情婷婷| 凹凸国产熟女精品视频| 国产综合亚洲精品一区二| 中文字幕在线中文字幕日亚韩一区 | 在哪里可以看毛片| 99热这里都是精品| 亚洲精品久久一区二区三区777 | 在线看免费av| 国产一区二区三区视频免费| 能在线看的av| 亚洲美女中文字幕| 四虎精品成人影院观看地址| 欧美视频裸体精品| 国产精品50页| 亚洲va中文字幕| 国产真实乱人偷精品视频| 一区二区三区四区高清精品免费观看| 亚洲综合久久av一区二区三区| 国产日韩欧美制服另类| 亚洲区自拍偷拍| 国产亚洲一区二区三区四区| 中文人妻一区二区三区| 91视频免费看| 97伦伦午夜电影理伦片| 久久亚洲一区二区三区明星换脸 | 中文字幕av久久爽av| 亚洲天堂成人网| 极品久久久久久| 尤物在线观看一区| 久久久久久福利| 亚洲国产精品麻豆| 国产成人无码精品| 色婷婷av一区二区三区gif| 日本免费精品视频| 欧美色大人视频| 国产一区二区在线视频观看| 56国语精品自产拍在线观看| 国产三级三级在线观看| 日韩午夜精品电影| 色噜噜在线播放| 亚洲欧美国产制服动漫| 91伦理视频在线观看| 久久精品91久久香蕉加勒比| 色婷婷在线播放| 91精品国产高清久久久久久久久| 午夜久久中文| 国产精品香蕉在线观看| 欧美久久亚洲| 激情伦成人综合小说| 国产一区二区三区精品在线观看 | 日韩手机在线观看视频| 老司机午夜精品| 国产视频一视频二| 可以免费看不卡的av网站| 污污动漫在线观看| 国产精品99久| 国产精品视频中文字幕| 国产美女精品在线| 人体私拍套图hdxxxx| 国产欧美一区在线| 一本一本久久a久久| 久久久国产一区二区三区四区小说| 中文字幕黄色网址| 亚洲综合在线第一页| 国产又粗又长又黄的视频| 亚洲老妇xxxxxx| 丁香六月婷婷综合| 4438x成人网最大色成网站| 神马一区二区三区| www.xxxx欧美| 日本三级一区| 91中文字幕在线观看| 琪琪久久久久日韩精品| 超碰在线免费观看97| 亚洲一区视频| 手机看片国产精品| 国产嫩草影院久久久久| 久久亚洲成人av| 欧美日韩中字一区| 五月婷婷在线观看视频| 久久精品国产清自在天天线| 悠悠资源网亚洲青| 99久久伊人精品影院| 欧美日韩一区二区三区视频播放| 999一区二区三区| 免费观看在线综合色| 女人被狂躁c到高潮| 亚洲男人天堂一区| 天天天天天天天干| 亚洲精品福利视频| 2020国产在线视频| 国产精品永久在线| 久久av中文| 777777av| 处破女av一区二区| 特一级黄色录像| 欧美色倩网站大全免费| 青青青免费视频在线2| 欧美激情高清视频| 国产视频一区二区在线播放| 亚洲永久一区二区三区在线| 男人的天堂亚洲在线| 国产大尺度视频| 亚洲精品成人精品456| 国产精品探花视频| 丝袜情趣国产精品| 国产精品亚洲一区二区三区在线观看| 国外成人免费视频| 激情综合激情| 少妇欧美激情一区二区三区| 国产精品久久久久7777按摩| 天天爱天天做天天爽| 亚洲精品之草原avav久久| 国产美女高潮在线| 国产在线播放一区二区| 国产在线欧美| 特级特黄刘亦菲aaa级| 亚洲精品免费播放| 精品国自产在线观看| 欧美成人一区二区三区电影| 懂色av色香蕉一区二区蜜桃| 伊人久久大香线蕉精品| 免费在线看成人av| 国产第一页精品| 欧美精品一级二级| 高清免费电影在线观看| 亚洲伊人久久大香线蕉av| 自拍欧美日韩| 免费观看美女裸体网站| caoporen国产精品视频| 国内免费精品视频| 日韩精品小视频| 日韩欧美一区二区三区免费观看| 日本不卡一区| 九一九一国产精品| 午夜少妇久久久久久久久| 精品久久久久久久人人人人传媒| 日韩三级免费| 国产综合欧美在线看| 亚洲欧美日本日韩| 久久精品—区二区三区舞蹈| 欧美日免费三级在线| 国产原创精品视频| 97se亚洲综合| 禁断一区二区三区在线| 麻豆三级在线观看| 亚洲男人的天堂网| 免费国产羞羞网站视频| 欧美综合激情网| 日韩欧美电影| 少妇伦子伦精品无吗| 精品久久久久久亚洲国产300| 国产精品四虎| 999国产视频| 久久精品亚洲一区二区| 国产色无码精品视频国产| 精品国产一二三区| 神马久久资源| 久久人妻无码一区二区| 久久久久久久久一| 国产日韩精品suv| 欧美一级淫片丝袜脚交| 嗯用力啊快一点好舒服小柔久久| 免费看国产曰批40分钟| 国产精品视频第一区| 性生交生活影碟片| 国产成人拍精品视频午夜网站| 国产精品久久久久蜜臀| 中文在线永久免费观看| 欧美日本韩国一区二区三区视频 | 精品日韩视频在线观看| 婷婷成人激情| 久久精品国产一区二区三区日韩| 久久精品国产精品亚洲红杏| 久久狠狠高潮亚洲精品| 久久亚洲精品一区| 九九免费精品视频在线观看|