1. 程式人生 > >node+koa2+mongod構建專案及與express對比

node+koa2+mongod構建專案及與express對比

一鍵生成koa2專案:
1、 npm install -g koa-generator
2、新建專案目錄 koa mytest (koa1專案) koa2 koa2test (koa2專案)
3、進入目錄 cd koa2test
4、安裝依賴 npm install
5、執行 npm start

 

mongoose連線:

var mongoose = require('mongoose');
var Goods = require('../models/goods');
 
 
//連線MongoDB資料庫
mongoose.connect('mongodb://quan:[email protected]
:27017/material',{useMongoClient:true}); //quan ->使用者名稱; 123456 ->密碼 ;127.0.0.1:27017/material mongod資料庫/表 mongoose.connection.on("connected", function () { //監聽連線成功 console.log("MongoDB connected success.") }); mongoose.connection.on("error", function () { //監聽連線失敗 console.log("MongoDB connected fail.") }); mongoose.connection.on("disconnected", function () { //監聽掉線 console.log("MongoDB connected disconnected.") });

  

 

model模態

var mongoose = require('mongoose')
var Schema = mongoose.Schema;
 
 
var produtSchema = new Schema({
  "id":String,
  "url":String,
  "click":Number,
  "pv":Number,
  "ctr":Number,
  "dtus":String
});
 
module.exports = mongoose.model('landpage',produtSchema); //material下的表,對應landpages 如下圖

  

 

 

koa-router:

我的專案結構,app.js 專案入口,models 模態 routes 路由

app.js

const Koa = require('koa')
const app = new Koa()
const router = require('koa-router')()
 
 
const api = require('./routes/goods')
 
 
// routes
router.use('/api', api.routes(), api.allowedMethods())
app.use(api.routes())

 goods.js 路由,介面邏輯

var router = require('koa-router')()
var mongoose = require('mongoose');
var Goods = require('../models/goods');
 
 
//連線MongoDB資料庫
mongoose.connect('mongodb://quan:[email protected]:27017/material',{useMongoClient:true});
 
mongoose.connection.on("connected", function () {
  console.log("MongoDB connected success.")
});
 
mongoose.connection.on("error", function () {
  console.log("MongoDB connected fail.")
});
 
mongoose.connection.on("disconnected", function () {
  console.log("MongoDB connected disconnected.")
});
 
 
router.post("/addPv", async (ctx, next) =>  {  //post請求
//   console.log(ctx.request.body)
//  console.log(ctx.request.body.id)
  let id = ctx.request.body.id  //獲取前端介面傳參
  var conditions = {id: id};
  var updates = {};
 
 
  const res = await Goods.find(conditions).catch(err => ctx.throw(500, '伺服器內部錯誤'))  //資料庫查詢
  console.log(res)
    if (res) {
      // console.log(res[0].pv+1);
      if(ctx.request.body.cmd == 1001) { //1001 pv; 1002 click
 
        updates = {$set: {pv: res[0].pv+1, ctr:res[0].click/(res[0].pv+1)}};
      } else if(ctx.request.body.cmd == 1002) {
 
        updates = {$set: {click: res[0].click+1, ctr:(res[0].click+1)/(res[0].pv)}};
      }
       
 
      const up = await Goods.update(conditions, updates).catch(err => ctx.throw(500, '伺服器內部錯誤'))  //資料庫更新資料
      console.log(up)
      if (up) {
        ctx.response.body = "更新成功"  //傳給前端介面返回的值
      } else {
        ctx.response.body = "更新失敗" 
      }    
    }
   
});
 
module.exports = router;

 

 

中介軟體

統一編寫介面返回值:

在middlewares資料夾增加 response_formatter.js

/**
 * 在app.use(router)之前呼叫
 */
var response_formatter = async (ctx, next) => {
    //先去執行路由
    await next();
 
 
    //如果有返回資料,將返回資料新增到data中
    if (ctx.body) {
        ctx.body = {
            code: 0,
            message: 'success',
            data: ctx.body
        }
    } else {
        ctx.body = {
            code: 0,
            message: 'success'
        }
    }
}
 
module.exports = response_formatter;

在app.js引用

const response_formatter = require('./middlewares/response_formatter');
 
 
//新增格式化處理響應結果的中介軟體,在新增路由之前呼叫
app.use(response_formatter);

 

 

koa2與 express區別:

1、express用 express-generator生成應用

npm install express-generator -g
在當前工作目錄下建立一個命名為 myapp 的應用。
express myapp
 cd myapp 
 npm install

2、查詢資料庫的區別

router.post("/addPv", function (req,res,next) {
 console.log(req.body.id)
  let id = req.body.id  //獲取前端傳參
  var conditions = {id: id};
  var updates = {};
  // let obj = new Goods({url:"http://test-static.qukan.aimodou.net/wlx/image/2018/09/21/5ba4e9518093d.png",click:20,pv:1000,ctr:"2%",dtus:"2282",id:"7"})
  // obj.save((err,res) => { })
 
 
  Goods.find(conditions, (err,doc1) => {  // 在查詢回撥裡處理更新資料庫
    if (err) {
      console.log(err);
    } else {
      // console.log(doc1[0].pv+1);
      if(req.body.cmd == 1001) { //1001 pv; 1002 click
 
        updates = {$set: {pv: doc1[0].pv+1, ctr:doc1[0].click/(doc1[0].pv+1)}};
      } else if(req.body.cmd == 1002) {
 
        updates = {$set: {click: doc1[0].click+1, ctr:(doc1[0].click+1)/(doc1[0].pv)}};
      }
       
 
      Goods.update(conditions, updates, function (err,doc) {  // 在更新回撥裡處理介面返回
        console.log(err,doc)
          if (err) {
              console.error(err);
              res.json({  //介面返回處理跟koa2不同,koa2是 ctx.response.body = ''
                status:'-1',
                msg:err.message
              });
          } else {
              console.error("更新成功")
              res.json({
                status:'0',
                msg:'ok',
            });
          }
      });
    }
  })
   
});

3、路由router的區別

express在app.js

var express = require('express');
var goods = require('./routes/goods')
 
var app = express();
app.use('/goods', goods);