nodejs koa2开发框架 全局安装 目录介绍

1.1 安装koa-generator

$ npm install -g koa-generator

1.2 使用koa-generator生成koa2项目

 koa2  -e project(项目名称)   (-e 代表使用模板引擎ejs) -e 可以不加

1.3 进入项目

$ cd project 
$ npm install

app.js

包括链接redis、morgan日志、 session 配置 一定要在注册路由之前写

const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json') // 处理json
const onerror = require('koa-onerror') // 处理错误
const bodyparser = require('koa-bodyparser') // post data
const logger = require('koa-logger')  // 比较简单、美观的日志

const session = require('koa-generic-session') // 插件一  链接redis
const redisStore = require('koa-redis') // 插件二 链接redis

const path = require('path')
const fs = require('fs')

const morgan = require('koa-morgan')  // morgan 日志

const index = require('./routes/index')
const users = require('./routes/users')
const blog = require('./routes/blog')
const user = require('./routes/user')

const { REDIS_CONF } = require('./conf/db')

// 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: 'pug'
}))

// 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`)
})

const ENV = process.env.NODE_ENV
if (ENV !== 'production') {
  // 开发环境 / 测试环境
  app.use(morgan('dev'));
} else {
  // 线上环境
  const logFileName = path.join(__dirname, 'logs', 'access.log')
  const writeStream = fs.createWriteStream(logFileName, {
    flags: 'a'
  })
  app.use(morgan('combined', {
    stream: writeStream
  }));
}

// session 配置   一定要在注册路由之前写
app.keys = ['WJiol#23123_']
app.use(session({
  // 配置 cookie
  cookie: {
    path: '/',
    httpOnly: true,
    maxAge: 24 * 60 * 60 * 1000
  },
  // 配置 redis
  store: redisStore({
    // all: '127.0.0.1:6379'   // 写死本地的 redis
    all: `${REDIS_CONF.host}:${REDIS_CONF.port}`
  })
}))

// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
app.use(blog.routes(), blog.allowedMethods())
app.use(user.routes(), user.allowedMethods())

// error-handling
app.on('error', (err, ctx) => {
  console.error('server error', err, ctx)
});

module.exports = app

package.json

{
  "name": "blog-koa2",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "start": "node bin/www",
    "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www",
    "prd": "cross-env NODE_ENV=production pm2 start bin/www",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "dependencies": {
    "debug": "^2.6.3",
    "koa": "^2.2.0",
    "koa-bodyparser": "^3.2.0",
    "koa-convert": "^1.2.0",
    "koa-generic-session": "^2.0.1",
    "koa-json": "^2.0.2",
    "koa-logger": "^2.0.1",
    "koa-morgan": "^1.0.1",
    "koa-onerror": "^1.2.1",
    "koa-redis": "^3.1.3",
    "koa-router": "^7.1.1",
    "koa-static": "^3.0.0",
    "koa-views": "^5.2.1",
    "mysql": "^2.16.0",
    "pug": "^2.0.0-rc.1",
    "redis": "^2.8.0",
    "xss": "^1.0.3"
  },
  "devDependencies": {
    "cross-env": "^5.2.0",
    "nodemon": "^1.8.1"
  }
}

介绍koa2 async\await 以及拆分出来的路由

mysql.js

const mysql = require('mysql')
const { MYSQL_CONF } = require('../conf/db')

// 创建链接对象
const con = mysql.createConnection(MYSQL_CONF)

// 开始链接
con.connect()

// 统一执行 sql 的函数
function exec(sql) {
    const promise = new Promise((resolve, reject) => {
        con.query(sql, (err, result) => {
            if (err) {
                reject(err)
                return
            }
            resolve(result)
        })
    })
    return promise
}

module.exports = {
    exec,
    escape: mysql.escape
}

controller/blog.js

const xss = require('xss')
const { exec } = require('../db/mysql')

const getList = async (author, keyword) => {
    let sql = `select * from blogs where 1=1 `
    if (author) {
        sql += `and author='${author}' `
    }
    if (keyword) {
        sql += `and title like '%${keyword}%' `
    }
    sql += `order by createtime desc;`

    return await exec(sql)
}

const getDetail = async (id) => {
    const sql = `select * from blogs where id='${id}'`
    const rows = await exec(sql)
    return rows[0]
}

const newBlog = async (blogData = {}) => {
    // blogData 是一个博客对象,包含 title content author 属性
    const title = xss(blogData.title)
    // console.log('title is', title)
    const content = xss(blogData.content)
    const author = blogData.author
    const createTime = Date.now()

    const sql = `
        insert into blogs (title, content, createtime, author)
        values ('${title}', '${content}', ${createTime}, '${author}');
    `

    const insertData = await exec(sql)
    return {
        id: insertData.insertId
    }
}

const updateBlog = async (id, blogData = {}) => {
    // id 就是要更新博客的 id
    // blogData 是一个博客对象,包含 title content 属性

    const title = xss(blogData.title)
    const content = xss(blogData.content)

    const sql = `
        update blogs set title='${title}', content='${content}' where id=${id}
    `

    const updateData = await exec(sql)
    if (updateData.affectedRows > 0) {
        return true
    }
    return false
}

const delBlog = async (id, author) => {
    // id 就是要删除博客的 id
    const sql = `delete from blogs where id='${id}' and author='${author}';`
    const delData = await exec(sql)
    if (delData.affectedRows > 0) {
        return true
    }
    return false
}

module.exports = {
    getList,
    getDetail,
    newBlog,
    updateBlog,
    delBlog
}

routes/blog.js

const router = require('koa-router')()
const {
  getList,
  getDetail,
  newBlog,
  updateBlog,
  delBlog
} = require('../controller/blog')
const { SuccessModel, ErrorModel } = require('../model/resModel')
const loginCheck = require('../middleware/loginCheck')

router.prefix('/api/blog')

router.get('/list', async function (ctx, next) {
    let author = ctx.query.author || ''
    const keyword = ctx.query.keyword || ''

    if (ctx.query.isadmin) {
        console.log('is admin')
        // 管理员界面
        if (ctx.session.username == null) {
            console.error('is admin, but no login')
            // 未登录
            ctx.body = new ErrorModel('未登录')
            return
        }
        // 强制查询自己的博客
        author = ctx.session.username
    }

    const listData = await getList(author, keyword)
    ctx.body = new SuccessModel(listData)
})

router.get('/detail', async function (ctx, next) {
    const data = await getDetail(ctx.query.id)
    ctx.body = new SuccessModel(data)
})

router.post('/new', loginCheck, async function (ctx, next) {
  const body = ctx.request.body
  body.author = ctx.session.username
  const data = await newBlog(body)
  ctx.body = new SuccessModel(data)
})

router.post('/update', loginCheck, async function (ctx, next) {
    const val = await updateBlog(ctx.query.id, ctx.request.body)
    if (val) {
        ctx.body = new SuccessModel()
    } else {
        ctx.body = new ErrorModel('更新博客失败')
    }
})

router.post('/del', loginCheck, async function (ctx, next) {
  const author = ctx.session.username
  const val = await delBlog(ctx.query.id, author)
  if (val) {
      ctx.body = new SuccessModel()
  } else {
      ctx.body = new ErrorModel('删除博客失败')
  }
})

module.exports = router

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Node.js 中使用 Koa 框架进行事务管理可以使用以下两种方式: 1. 使用数据库事务:如果你使用的是支持事务的数据库(如 MySQL、PostgreSQL 等),那么你可以使用数据库提供的事务功能来管理事务。在 Koa 中,你可以使用像 Sequelize 这样的 ORM 库来管理数据库操作。 例如,在 Sequelize 中使用事务的代码示例: ``` // 创建一个事务 const transaction = await sequelize.transaction(); try { // 在事务中执行数据库操作 await User.create({ name: 'John Doe' }, { transaction }); await Profile.create({ userId: 1, bio: 'Hello, world' }, { transaction }); // 提交事务 await transaction.commit(); } catch (error) { // 回滚事务 await transaction.rollback(); } ``` 在上面的示例中,我们使用了 `sequelize.transaction()` 方法来创建一个事务,并将其传递给每个数据库操作。如果其中任何一个操作失败,那么事务将会回滚,所有操作都将被撤销。 2. 使用 Koa 中间件:另一种管理事务的方法是使用 Koa 中间件来实现。你可以编写一个中间件函数,将所有需要在事务中执行的操作包裹起来,并在出现错误时回滚事务。 例如,在 Koa 中使用中间件管理事务的代码示例: ``` app.use(async (ctx, next) => { const transaction = await sequelize.transaction(); try { // 将事务对象绑定到上下文对象中 ctx.transaction = transaction; // 执行下一个中间件 await next(); // 提交事务 await transaction.commit(); } catch (error) { // 回滚事务 await transaction.rollback(); // 抛出错误 throw error; } }); // 在路由中使用事务 router.post('/users', async (ctx) => { // 从上下文对象中获取事务对象 const transaction = ctx.transaction; try { // 在事务中执行数据库操作 await User.create({ name: 'John Doe' }, { transaction }); await Profile.create({ userId: 1, bio: 'Hello, world' }, { transaction }); // 发送响应 ctx.body = { success: true }; } catch (error) { // 如果发生错误,将会自动回滚事务 throw error; } }); ``` 在上面的示例中,我们编写了一个 Koa 中间件函数,该函数会在每个请求中创建一个事务,并将其绑定到上下文对象中。在路由处理函数中,我们可以从上下文对象中获取事务对象,并使用它来执行数据库操作。如果任何一个操作失败,中间件将会回滚事务,并将错误抛出到全局错误处理函数中。 总的来说,使用数据库事务或 Koa 中间件来管理事务都是有效的方式。选择哪种方式取决于你的具体需求和项目的架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值