koa2搭建伺服器+使用mongoose連結mangodb

kimingw發表於2018-10-09

使用node搭建伺服器,用到了現在比較流行的框架koa。

1、初始化package.json

npm init -y

2、安裝koa2

npm i koa --save

3、搭建伺服器

const Koa = require('koa')
const app = new Koa()

app.use( async(ctx) => {
    ctx.body = "hello world"
})
app.listen(3000, () => {
    console.log('demo2 is run')
})

4、直接執行

node index.js

5、加入get或者post請求

app.use(async(ctx) => {
    if (ctx.url === '/' && ctx.method === 'GET') {
        let html = `
        <h2>This is demo2</h2>
        <form method="POST" action="/">
            <p>username:</p>
            <input name="username">
            <p>age:</p>
            <input name="age">
            <p>website</p>
            <input name="website">
            <button type="submit">submit</button>                   
        </form>
        `
        ctx.body = html
    } else if (ctx.url === '/' && ctx.method === 'POST') {
        let postData = await parsePostDate(ctx)
        ctx.body = postData
    } else {
        ctx.body = '<h2>404</h2>'
    }
})

const parsePostDate = (ctx) => {
    return new Promise((resolve, reject) => {
        try{
            let postData = ""
            ctx.req.on('data', (data) => {
                postData += data
            })
            ctx.req.addListener("end", function() {
                let parseData = parseQueryStr(postData)
                resolve(parseData)
            })
        } catch(error) {
            reject(error)
         }
    })
}

const parseQueryStr = (queryStr) => {
    const queryData = {}
    const queryStrList = queryStr.split('&')
    console.log(queryStrList)
    for (let [index,queryStr] of queryStrList.entries()) {
        let itemList = queryStr.split('=')
        console.log(itemList)
        queryData[itemList[0]] = decodeURIComponent(itemList[1])
    }
    return queryData
}

6、上面簡單介紹了koa怎麼開啟簡單的伺服器,但是koa的強大之處在於能夠加入很多好用的中介軟體

7、加入koa-bodyparser中介軟體簡化post請求後

app.use(async(ctx) => {
    if (ctx.url === '/' && ctx.method === 'GET') {
        let html = `
        <h2>This is demo2</h2>
        <form method="POST" action="/">
            <p>username:</p>
            <input name="username">
            <p>age:</p>
            <input name="age">
            <p>website</p>
            <input name="website">
            <button type="submit">submit</button>                 
        </form>
        `
        ctx.body = html
    } else if (ctx.url === '/' && ctx.method === 'POST') {
        let postData = ctx.request.body
        ctx.body = postData
    } else {
        ctx.body = '<h2>404</h2>'
    }
})

8、加入koa-router中介軟體簡化請求判斷

router
    .get('/', (ctx, next) => {
        let html = `
        <h2>This is demo2</h2>
        <form method="POST" action="/">
            <p>username:</p>
            <input name="username">
            <p>age:</p>
            <input name="age">
            <p>website</p>
            <input name="website">
            <button type="submit">submit</button>                 
        </form>
        `
        ctx.body = html
    })
    .post('/',(ctx, next) => {
        let postData = ctx.request.body
        ctx.body = postData
    })
app
    .use(router.routes())
    .use(router.allowedMethods())
 

9、引入koa2-cors中介軟體,設定請求跨域與請求型別

app.use(cors({
    origin: function (ctx) {
        if (ctx.url === '/test') {
            return "*"; // 允許來自所有域名請求
        }
        return 'http://localhost:8080'; / 這樣就能只允許 http://localhost:8080 這個域名的請求了
    },
    exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
    maxAge: 5,
    credentials: true,
    allowMethods: ['GET', 'POST', 'DELETE'],
    allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
}))

10、加入koa-static中介軟體,伺服器可訪問靜態檔案

// 引入node的path方便一些
const path = require('path') 
app.use(static((path.join(__dirname,  'images'))))

11、還可以引入koa-send實現檔案下載

router.get('/download', async function (ctx) {
    // 為了方便演示,這裡直接下載index頁面
    var fileName = 'index.html';
    // Set Content-Disposition to "attachment" to signal the client to prompt for download.
    // Optionally specify the filename of the download.
    // 設定實體頭(表示訊息體的附加資訊的頭欄位),提示瀏覽器以檔案下載的方式開啟
    // 也可以直接設定 ctx.set("Content-disposition", "attachment; filename=" + fileName);
    ctx.attachment(fileName);
    await send(ctx, fileName, { root: __dirname + '/public' });
});

12、伺服器整體構建完成,那麼就要連結資料庫(請自行在電腦上安裝mongodb,https://www.mongodb.com/

13、加入mongoose依賴連結本地的mangodb

// 直接在index.js下引入
const mongoose = require('mongoose') var dbUrl = `mongodb://127.0.0.1:27017/test` mongoose.connect(dbUrl, {useNewUrlParser:true} ,(err) => { if (err) { console.log('Mongoose connection error: ' + err.message) } else { console.log('資料庫連線成功') } }) mongoose .connection .on('disconnected', function () { console.log('Mongoose connection disconnected') }) module.exports = mongoose

14、mongoose的增刪改查,mongoose都是要先建立一個圖表(Schema)然後再對其進行操作

const mongoose = require('mongoose')
// 創圖表
var schema = new mongoose.Schema({ 
    num:Number, 
    name: String, 
    size: String
})
// 增
new model({age:10,name:'save'}).save(function(err,doc){
    console.log(doc);        
})
// 刪
temp.remove({name:/30/},function(err){})
// 改
await model.update({age:{$gte:20}},{age:40},function(err,raw){
    console.log(raw);
})
// 查
await model.find((err,doc) => {
    console.log(doc)
})    

15、詳細點的mangoose增刪改查 

//增(new + save)
let data = await(()=>{
    return new Promise((resolve, reject) => {
        new model({age:10,name:'save'}).save(function(err,doc){
            //[ { _id: 59720bc0d2b1125cbcd60b3f, age: 10, name: 'save', __v: 0 } ]
            console.log(doc)
            resolve(doc)
        });  
    })
})()

//刪(deleteOne或者deleteMany)
let data =await model.deleteMany({name:/save/},function(err){})

//改(updateOne或者updateMany)
let data =await model.update({num:{$gte:20}},{num:40},function(err,raw){})

//查(find)
let data = await model.find(function (err,doc) {})

16、文件判斷

$or    或關係
$nor    或關係取反
$gt    大於
$gte    大於等於
$lt    小於
$lte    小於等於
$ne    不等於
$in    在多個值範圍內
$nin    不在多個值範圍內
$all    匹配陣列中多個值
$regex   正則,用於模糊查詢
$size   匹配陣列大小
$maxDistance 範圍查詢,距離(基於LBS)
$mod    取模運算
$near    鄰域查詢,查詢附近的位置(基於LBS)
$exists   欄位是否存在
$elemMatch 匹配內陣列內的元素
$within   範圍查詢(基於LBS)
$box     範圍查詢,矩形範圍(基於LBS)
$center   範圍醒詢,圓形範圍(基於LBS)
$centerSphere 範圍查詢,球形範圍(基於LBS)
$slice    查詢欄位集合中的元素(比如從第幾個之後,第N到第M個元素

 

 參考連結:

1、mongoose基礎入門https://www.cnblogs.com/xiaohuochai/p/7215067.html?utm_source=itdadao&utm_medium=referral

2、koa初體驗https://www.jianshu.com/p/b988ce30bac3

3、koa快速入門https://www.cnblogs.com/houhanbin121456/p/8297472.html

4、使用koa離不開的十個中介軟體https://www.jianshu.com/p/c1e0ca3f9764

  

相關文章