安裝koa-generator腳手架,並創建一個項目
全局安裝:cnpm install -g koa-generator 查看版本:koa2 --version 創建項目:koa2 project 默認的是用jade模板引擎的 koa2 -e koa2-learn 使用的是ejs模板引擎,項目名稱koa2-learn 初始化:cnpm install 運行:SET DEBUG=koa* npm start localhost:3000 運行:方式二:開發模式/修改后自啟動 npm run dev
安裝mongoDB數據庫,並安裝mongoose
mongodb的概念及安裝 非關系型數據庫, mongoose為模型提供了一種直接的,基於scheme結構去定義你的數據模型。它內置數據驗證, 查詢構建,業務邏輯鈎子等,開箱即用。 mongodb可視化工具RoBo 3T 安裝及應用 下載地址:https://robomongo.org/download mongoose的作用 文檔地址:http://www.mongoosejs.net/docs/schematypes.html 操作mongoDB數據庫, mongoose的應用 安裝mongoose: cnpm install mongoose
使用es6,配置babel.文件
修改package.json文件 "dev": "cross-env NODE_ENV=development nodemon server/index.js --watch server --exec babel-node", "start": "cross-env NODE_ENV=production node server/index.js --exec babel-node", 新增babel配置文件 .babelrc { "presets":["es2015"] } 下載babel-preset-es2015文件 cnpm install babel-preset-es2015 報錯:'babel-node' 不是內部或外部命令,也不是可運行的程序 解決辦法:執行cnpm i babel-core babel-preset-es2015 babel-cli

const session = require('koa-session'); const Koa = require('koa'); const app = new Koa(); app.keys = ['some secret hurr']; const CONFIG = { key: 'koa:sess', /** (string) cookie key (default is koa:sess) */ /** (number || 'session') maxAge in ms (default is 1 days) */ /** 'session' will result in a cookie that expires when session/browser is closed */ /** Warning: If a session cookie is stolen, this cookie will never expire */ maxAge: 86400000, autoCommit: true, /** (boolean) automatically commit headers (default true) */ overwrite: true, /** (boolean) can overwrite or not (default true) */ httpOnly: true, /** (boolean) httpOnly or not (default true) */ signed: true, /** (boolean) signed or not (default true) */ rolling: false, /** (boolean) Force a session identifier cookie to be set on every response. The expiration is reset to the original maxAge, resetting the expiration countdown. (default is false) */ renew: false, /** (boolean) renew session when session is nearly expired, so we can always keep user logged in. (default is false)*/ }; app.use(session(CONFIG, app)); // or if you prefer all default config, just use => app.use(session(app)); app.use(ctx => { // ignore favicon if (ctx.path === '/favicon.ico') return; let n = ctx.session.views || 0; ctx.session.views = ++n; ctx.body = n + ' views'; }); app.listen(3000); console.log('listening on port 3000');
使用request模塊
request是服務端發起請求的工具包

// 默認是GET請求 var request = require('request'); request('您的請求url', function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // 請求成功的處理邏輯 } }); // POST請求 var request = require('request'); var url="請求url"; var requestData="需要傳輸的數據"; request({ url: url, method: "POST", json: true, headers: { "content-type": "application/json", }, body: JSON.stringify(requestData) }, function(error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // 請求成功的處理邏輯 } }); // POST form格式上傳數據 request.post({url:'', form:{key:'value'}}, function(error, response, body) { if (!error && response.statusCode == 200) { console.log(body) // 請求成功的處理邏輯 } })
創建connectDB.js,利用mongoose連接數據庫

import mongoose from 'mongoose'; const db = 'mongodb://127.0.0.1/my_test'; // 導出一個方法 exports.connect = () => { // 連接數據庫 mongoose.connect(db); // 記錄數據庫連接的次數 let maxConnectTimes = 0; return new Promise((resolve, reject) => { // 連接成功操作 mongoose.connection.once('open', () => { console.log('Mongodb 數據庫連接成功.'); resolve(); }); // 連接斷開操作 mongoose.connection.on('disconnected', () => { console.log('*********** 數據庫斷開 ***********'); if (maxConnectTimes < 3) { maxConnectTimes++; mongoose.connect(db); } else { reject(new Error('數據庫連接失敗')); throw new Error('數據庫連接失敗'); } }); // 連接失敗操作 mongoose.connection.on('error', error => { console.log('*********** 數據庫錯誤 ***********'); if (maxConnectTimes < 3) { maxConnectTimes++; mongoose.connect(db); } else { reject(error); throw new Error('數據庫連接失敗'); } }); }); }
app.js代碼

import Koa from 'koa' //必須使用babel import views from 'koa-views' import json from 'koa-json' import onerror from 'koa-onerror' import bodyparser from 'koa-bodyparser' import logger from 'koa-logger' const app = new Koa() // 導入數據庫連接文件 import { connect } from'./utils/connectDB'; const index = require('./routes/index') const users = require('./routes/users') // error handler onerror(app) // middlewares app.use(bodyparser({ enableTypes:['json', 'form', 'text'] })) app.use(json()) app.use(logger()) app.use(require('koa-static')(__dirname + '/public')) app.use(views(__dirname + '/views', { extension: 'ejs' })) // logger app.use(async (ctx, next) => { const start = new Date() await next() const ms = new Date() - start // console.log(`${ctx.method} ${ctx.url} - ${ms}ms`) }) // routes app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods()) // error-handling app.on('error', (err, ctx) => { console.error('server error', err, ctx) }); // 立即執行函數 (async () => { await connect(); // 執行連接數據庫任務 })(); module.exports = app