zoukankan      html  css  js  c++  java
  • koa2搭建服务器+使用mongoose链接mangodb

    使用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

      

  • 相关阅读:
    第19章_枚举:
    第14章_类型信息:
    第13章_字符串:
    纯css背景图自适应
    事务隔离机制_悲观锁_乐观锁
    hibernate 缓存
    list 和 iterate
    hibernate 性能优化之 1+N 问题
    QBC(Query By Criteria) QBE (Query By Example)
    HQL(Hibernate Query Language)
  • 原文地址:https://www.cnblogs.com/huangqiming/p/9761762.html
Copyright © 2011-2022 走看看