最近終于有時間?靜下心來學(xué)學(xué)node
相關(guān)的知識了,那么來做一個什么東西呢隔嫡?想來想去還是來做一個簡單的bolg吧~~甸怕。接下來就介紹一下具體的歷程。
技術(shù)棧
- node
- express(web應(yīng)用框架)
- mongoose(數(shù)據(jù)庫)
- pm2(應(yīng)用進程管理)
- swagger(API功能調(diào)試)
項目介紹
本文章將用具體的項來介紹 node-app:https://github.com/Hancoson/node-app
文件結(jié)構(gòu)
- app.js:入口文件
- package.json:工程信息及包管理
- node_moudules:依賴模塊
- public:靜態(tài)資源(css畔勤、js蕾各、images)
- routes:路由管理
- view:模版文件
- models:數(shù)據(jù)模型
- config:項目配置文件
- app:存放?控制器、公用方法等
- bin:項目配置腳本
MVC模式
- Model
-
node
提供的模塊庆揪,中間件式曲,在用express
創(chuàng)建項目時,產(chǎn)生node_modules
即表示M
層 - 模塊如
ejs
,mongoose
吝羞,morgan
兰伤,body-parser
等等
-
- View
-
express
生成項目時會產(chǎn)生views
,即前端
-
- Controller
- 即視圖向控制器發(fā)出請求,由控制器選擇相應(yīng)的模型來處理
- 模型返回的結(jié)果給控制器钧排,由控制器來選擇合適的視圖,生成界面給用戶
- 如通過
res.render
來渲染ejs
文件
路由
- 意義 : 訪問主頁時調(diào)用
ejs
模板引擎渲染index.ejs
文件 - 實現(xiàn)方法 :
- 在
app.js
中寫入require('./routes/index')(app)
即可引入?; - 路由中在引入對應(yīng)的
Controller
來實現(xiàn)具體數(shù)據(jù)的展示app.get('/articles/:id', articles.getArticle);
- 在
Controller
主要來處理業(yè)務(wù)邏輯敦腔,也就是說數(shù)據(jù)該怎么展示由他來管理,具體實現(xiàn)如下:
function (req, res) {
blogdbs.find({
_id: req.params.id //查詢條件
}, function (err, data) {
if (err) {
//err
} else {
res.render('articles', {
... //數(shù)據(jù)對象
});
}
})
}
Model
說Model
前先說說Schema
恨溜,那么Schema
是什么呢符衔?它類似于關(guān)系數(shù)據(jù)庫的表結(jié)構(gòu)。具體實現(xiàn)如下:
var mongoose = require('mongoose');
var schema = mongoose.Schema;
var _blogSchema = new Schema({
title: {
type: 'String'
},
...
});
接下來就可以創(chuàng)建Model
了糟袁,格式是mongoose.model(modelName, schema);
有Schema
后為什么還要有Model
呢判族?
在Mongoose
的設(shè)計理念中,Schema
用來也只定義數(shù)據(jù)結(jié)構(gòu)项戴,具體對數(shù)據(jù)的增刪改查操作都由Model
來執(zhí)行形帮。
就好比富士康用模具組裝出一臺手機后,當(dāng)需要打電話時是用手機來打而不是用模具周叮。
遇到的問題
node開發(fā)過程中需要?頻繁的重啟項目辩撑,后來學(xué)習(xí)解了
pm2
來管理進程,并可監(jiān)控node
服務(wù)端的更新仿耽,不用再重啟服務(wù)了合冀,開發(fā)效率大大提高。-
在服務(wù)端異步提交數(shù)據(jù)時候氓仲,
app.js
中需要加入以下代碼水慨,并且需要在路由引入的上方。app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: false}));
-
app.get()
敬扛,app.use()
和app.all()
- app.use(path,callback)中的callback既可以是router對象又可以是函數(shù)
- app.get(path,callback)中的callback只能是函數(shù),可以將 app.get() 看做 app.use() 的請求 get 方式的簡要寫法朝抖。
- app.all() 附加到應(yīng)用程序的路由啥箭,所以使用 app.router 中間件負責(zé)處理所有的路由請求,如:GET治宣、POST等急侥;
var express = require('express'); var app = express(); app.get('/hello',function(req,res,next){ res.send('hello test2'); }); //等同于: var express = require('express'); var app = express(); var router = express.Router(); router.get('/', function(req, res, next) { res.send('hello world!'); }); app.use('/hello',router);
如果您覺得閱讀本文對您有幫助,請“Star”侮邀,您的“Star”將是我最大的寫作動力坏怪!
項目地址:node-app