nodeJs —— 從零搭建一個koa項目


 

安裝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

 

安裝使用koa-session中間件

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');
example

 

使用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) // 請求成功的處理邏輯  
    }
})
request基本用法

 

創建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('數據庫連接失敗');
      }
    });
  });
}
connectDB.js

 

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
app.js

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM