注(2018-2-12):僅作記錄使用,又不捨得刪除,推薦使用koa2,koa2相關資料不少的~html
全局安裝node(v6.9.4)vue
安裝過程略
配置cnpm(npm的淘寶鏡象)node
sudo npm install -g cnpm --registry=https://registry.npm.taobao.org`
全局安裝vue官方腳手架工具vue-cli(vue官網文檔)webpack
cnpm install --global vue-cli
基於 webpack 模板建立web
vue init webpack tifi-music
建立配置按需,我除了安裝router以外其餘都選了noajax
運行與打包測試mongodb
cd tifi-misic //安裝依賴包 cnpm i //運行 npm run dev //打包 npm run build
在項目根目錄下建立server.js文件,內容以下vue-cli
//用於獲取路徑 const path = require('path') //用於讀寫文件流 const fs = require('fs') const express = require('express') //無需cnpm安裝,由於是express的中間件bodyParser //用於解析客戶端請求的body中的內容,內部使用JSON編碼處理,url編碼處理以及對於文件的上傳處理. //bodyParse能夠接受客戶端ajax提交的json數據,以及url的處理,不使用這個中間件將致使沒法接收客戶端的json數據 const bodyParser = require('body-parser') //須要cnpm安裝,cookieParser中間件用於獲取web瀏覽器發送的cookie中的內容. //在使用了cookieParser中間件後,表明客戶端請求的htto.IncomingMessage對象就具備了一個cookies屬性 //該屬性之爲一個對象的數組,其中存放了全部web瀏覽器發送的cookie,每個cookie爲cookies屬性值數組中的一個對象. const cookieParser = require('cookie-parser') //serve-favicon中間件用於請求網站的icon用法以下 //express().use(favicon(__dirname + '/public/images/favicon.ico')) const favicon = require('serve-favicon') //morgan中間件是日誌中間件,用於node的日誌輸出 //進階用法見http://www.cnblogs.com/chyingp/p/node-learning-guide-express-morgan.html const logger = require('morgan') //獲取後端路由.我設置在根目錄下的server文件,讀取下面的index.js const routes = require('./server/router') //用於管理配置的插件.統一管理後端服務端口和數據庫鏈接地址等,默認配置在config目錄下的default.js中 const config = require('config-lite') //compression 中間件用於壓縮和處理靜態內容 //例子:app.use(express.static(path.join(__dirname, 'public'))) const compression = require('compression') //實例化express對象,用於鏈接中間件 const app = express() app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(compression({ threshold: 0 })) app.use('/api', routes) app.use(express.static(path.resolve(__dirname, './dist'))) // 由於是單頁應用 全部請求都走/dist/index.html app.get('*', function(req, res) { const html = fs.readFileSync(path.resolve(__dirname, './dist/index.html'), 'utf-8') res.send(html) }) app.listen(config.port, function () { console.log(`Server running in port ${config.port}`) })
解決npm run dev時即開發模式下跨域問題
打開根目錄下的config目錄下的index文件,配置proxyTable以下:數據庫
proxyTable: { '/api': { //這裏的target填服務端的端口的接口地址 target: 'http://localhost:3000/api/', changeOrigin: true, pathRewrite: { '/api': '' } } }
建立router
server.js文件中寫了const routes = require('./server/router')
這裏require的路徑就是咱們須要建立router的路徑
在根目錄下建立server文件夾,並在其目錄下建立router.js文件,內容以下:express
//express的路由中間件,引入等待從controller中添加路由 const router = require('express').Router() //引入node的文件路徑模塊path和文件處理模塊fs const path = require('path') const fs = require('fs') //讀取controller文件下的全部控制器,爲了實現動態讀取控制器,有空再研究更好的寫法 const controllers = fs.readdirSync(path.resolve(__dirname, './controller')) //遍歷獲取到的文件,動態添加express的路由信息:url、type、response即請求路徑、請求方式、響應處理函數 controllers.forEach((file) => { //獲取到具體到控制器 let controller = require('./controller/' + file) //遍歷控制器攜帶的信息 for (let o in controller) { //獲取請求路徑,未取到則取默認路徑 爲'/'+文件名(不包括後綴) let url = controller[o].url ? controller[o].url : ('/' + o) //獲取請求方式,未取到則取默認方式 爲'get' let type = controller[o].type ? controller[o].type : 'get' //響應處理函數,未取到則使用默認的處理 let response = controller[o].response ? controller[o].response : (req, res) => { res.json({ success: false, info: '沒有處理響應的無效路由' }) } //設置路由信息 router[type](url, response) } }) //使用動態設置好的路由 router.use(router) //輸出路由 module.exports = router
建立controller
router.js文件中寫了獲取同級目錄controller下的全部文件
因此咱們只須要在server文件夾下的controller中建立一個user的控制器
即建立user.js文件,內容以下:
const userName = [{ name: '測試用戶名0' }, { name: '測試用戶名1' } ] //'輸出待添加的路由信息對象 //每一個對象中可設置三個屬性:url、type、response(不設置的話均作了默認處理) module.exports = { users: { response: (req, res) => { res.json(userName) } }, reg: { type: 'post', response: (req, res) => { res.json('reg') } } }
運行express
前面文件建立完成以後,要運行express首先安裝依賴包
cnpm i cookie-parser morgan serve-favicon morgan config-lite –save-dev
另外修改文件時須要頻繁的重啓服務器,全局安裝nodemon能夠實現自動重啓
cnpm install -g nodemon
而後配置package.json中的scripts添加start命令
"scripts": { "dev": "node build/dev-server.js", "build": "node build/build.js", "start": "nodemon server.js" }
安裝mongoose
cnpm install mongoose --save-dev
鏈接mongodb
編寫入口:在server文件下新建一個文件夾名爲db,並在其下新建一個文件db.js,內容以下:
//引入node的文件路徑模塊path和文件處理模塊fs const path = require('path') const fs = require('fs') const mongoose = require('mongoose') // mongodb 鏈接? mongoose.connect('mongodb://localhost/tifi-music') // 此處防止 node.js - Mongoose: mpromise 錯誤 mongoose.Promise = global.Promise; let db = mongoose.connection; db.on('error', console.error.bind(console, 'Connect error')) db.once('open', function() { console.log('Mongodb started successfully') }) //聲明待添加的model對象 let model = {} //讀取方式和router同樣 const schemas = fs.readdirSync(path.resolve(__dirname, './model')) schemas.forEach((file) => { //設置數據庫表名爲讀取到的文件名(去除後綴名) let name = file.substring(0,file.lastIndexOf(".")) //獲取到的對象就是數據庫字段 let schema = require('./model/' + file) //使用mongoose.Schema和mongoose.model完成對數據庫表和字段的建立 model[name] = mongoose.model(name, mongoose.Schema(schema)) }) //輸出model對象 module.exports = model
編寫model:也在db文件夾下新建一個文件夾名爲model,並在其下新建user.js,內容以下:
module.exports = { //設計數據庫字段,先簡單的設置一些經常使用的字段 name: String, phone: String, email: String, password: String, createTime: Date }
修改controller:修改controller文件下單user.js爲:
//'引入mongoose的model const model = require('../db/db') //加密用戶的密碼 const sha1 = require('sha1') //mogodb會自動的爲咱們添加_id字段,類型爲objectid,咱們要把它轉換成建立該用戶的時間 const objectIdToTimestamp = require('objectid-to-timestamp') module.exports = { //獲取全部用戶 users: { response: (req, res) => { model.User.find({}, (err, doc) => { if (err) console.log(err) res.send(doc) }) } }, //用戶註冊 reg: { type: 'post', response: (req, res) => { console.log(req.body); let userRegister = new model.User({ email: req.body.email, password: sha1(req.body.password), }) // 將 objectid轉換爲用戶建立時間,使用是的UTC國際標準時間 userRegister.createTime = objectIdToTimestamp(userRegister._id) //查詢郵箱是否已存在於數據庫 model.User.findOne({ email: (userRegister.email) .toLowerCase() }, (err, doc) => { if (err) console.log(err) if (doc) { res.json({ success: false, info: '該郵箱已被註冊' }) } else { userRegister.save(err => { if (err) console.log(err) console.log(new Date(), 'register success') res.json({ success: true, data: { email: userRegister.email } }) }) } }) } } }
運行mongoose與測試查詢與插入
![圖片描述][3] - 測試查詢數據,打開[postman][2]進行get請求,成功以後以下圖: ![圖片描述][5] - 若是前面都成功了,說明已經成功的鏈接了mongoose,說明所有的基礎建設已經搞好了,能夠進行下一步的開發了!