美文网首页
koa项目搭建

koa项目搭建

作者: 风之伤_3eed | 来源:发表于2019-04-17 12:12 被阅读0次

    一、初始化项目

    npm init -y
    

    二、安装依赖

    npm i koa
    npm i koa-router
    npm i mongoose
    

    三、构建服务

    访问所有路径都会返回hello World

    const Koa = require('koa');
    
    const app = new Koa();
    
    app.use(async ctx => {
      ctx.body = 'Hello World';
    });
    
    app.listen(5000);
    
    console.log('app started at port 3000...');
    

    四、添加路由

    const Koa = require('koa');
    const Router = require('koa-router');
    // 引入并实例化(简便写法)
    // const router = require('koa-router')();
    
    // 实例化
    const app = new Koa();
    const router = new Router();
    
    // 路由
    router.get('/index', async ctx => {
      ctx.body = '首页'
    });
    
    // 路由配置
    app.use(router.routes()).use(router.allowedMethods());
    
    const port = process.env.PORT || 5000;
    
    app.listen(port);
    
    console.log(`app started at port ${port}...`);
    

    五、 抽离路由文件

    在项目根目录下新建routers文件其中包含api文件夹下对应不同模块的路由地址
    routes/api/users文件内容

    const router = require('koa-router')();
    
    router.get('/user', async ctx => {
      ctx.body = {
        msg: 'user',
        data: 'hello'
      }
    });
    
    module.exports = router.routes();
    

    入口文件对路由的配置
    引入路由文件:const users = require('./routers/api/users');
    配置路由地址:router.use('/api/users', users);

    const Koa = require('koa');
    const Router = require('koa-router');
    // 引入并实例化
    // const router = require('koa-router')();
    // 引入路由文件
    const users = require('./routers/api/users');
    
    // 实例化
    const app = new Koa();
    const router = new Router();
    
    // 配置路由地址访问loacalhost: 5000/api/users时会进入users文件,再根据users文件中的路由分别匹配
    router.use('/api/users', users);
    
    // 路由配置
    app.use(router.routes()).use(router.allowedMethods());
    
    const port = process.env.PORT || 5000;
    
    app.listen(port);
    
    console.log(`app started at port ${port}...`);
    

    六、连接mongodb数据库

    1、引入mongdb数据库连接地址 const mongodbUrl = require('./config/key').mongodbUrl;
    在根目录下新建config 文件夹下放置mongodb数据库连接地址
    ./config/key.js

    module.exports = {
      mongodbUrl: '你的mongodb数据连接地址'
    }
    

    2、连接数据库

    mongoose.connect(mongodbUrl, { useNewUrlParser: true })
    .then(
      () => {
        console.log('mongdb 运行中...')
      }
    )
    .catch(
      (err) => {
        console.log(err)
      }
    )
    

    入口文件完整代码

    const Koa = require('koa');
    const Router = require('koa-router');
    // 引入并实例化
    // const router = require('koa-router')();
    const mongoose = require('mongoose');
    // 引入路由文件
    const users = require('./routers/api/users');
    // 引入mongdb数据库连接地址
    const mongodbUrl = require('./config/key').mongodbUrl;
    
    // 实例化
    const app = new Koa();
    const router = new Router();
    
    // 连接数据库
    mongoose.connect(mongodbUrl, { useNewUrlParser: true })
    .then(
      () => {
        console.log('mongdb 运行中...')
      }
    )
    .catch(
      (err) => {
        console.log(err)
      }
    )
    
    // 配置路由地址访问loacalhost: 5000/api/users时会进入users文件,再根据users文件中的路由分别匹配
    router.use('/api/users', users);
    
    // 路由配置
    app.use(router.routes()).use(router.allowedMethods());
    
    const port = process.env.PORT || 5000;
    
    app.listen(port);
    
    console.log(`app started at port ${port}...`);
    

    七、数据库存储数据

    在根目录新建models文件该文件用来存放实例数据模版
    ./models/User.js
    用户注册需要往数据库记录的数据为nameemailpasswordavatardate
    type为存储类型
    required为是否必填
    default:为默认值
    更多可以查看mongoose中文网

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    
    // 实例化数据模版
    const UserSchema = new Schema({
      name: {
        type: String,
        required: true
      },
      email: {
        type: String,
        required: true
      },
      password: {
        type: String,
        required: true
      },
      avatar: {
        type: String
      },
      date: {
        type: Date,
        default: Date.now
      }
    })
    
    module.exports = User = mongoose.model("users", UserSchema)
    

    在路由文件中进行数据处理存储
    ./routers/api/users.js

    const router = require('koa-router')();
    const User = require('../../models/User');
    
    router.get('/user', async ctx => {
      ctx.body = {
        msg: 'user',
        data: 'hello'
      }
    });
    
    router.post("/register", async ctx => {
        // mongoose查询语句find
      const findResult = await User.find({
        email: ctx.request.body.email
      });
    
      if (findResult.length > 0) {
        ctx.status = 500,
          ctx.body = {
            "email": "邮箱已被占用"
          }
      } else {
        const avatar = '';
        const newUser = new User({
          name: ctx.request.body.name,
          email: ctx.request.body.email,
          avatar,
          password: ctx.request.body.password
        })
    
        // 存储到数据库
        await newUser
          .save()
          .then(
            (user) => {
              ctx.body = user
            }
          )
          .catch(
            (err) => {
              console.log(err)
            }
          );
        // // 返回json数据
        ctx.body = newUser
      }
    })
    
    module.exports = router.routes();
    

    注:
    1、要想在post请求中获取前端传递过来的值(ctx.request.body.email)必须在入口文件引入koa-bodyparser中间件
    引入koa-bodyparser中间件const bodyParser = require('koa-bodyparser');
    使用koa-bodyparser中间件app.use(bodyParser());
    2、用户存储在数据库中的数据都为明文若想加密存储可以使用bcryptjs
    加密示例在newUser之后(要返回promise哦否则会不执行加密直接存入数据库)

    await new Promise((resolve) => {
          bcrypt.genSalt(10, (err, salt) => {
            bcrypt.hash(newUser.password, salt, (err, hash) => {
              // Store hash in your password DB.
              if (err) throw err;
              newUser.password = hash;
              resolve();
            });
          });
        })
    

    3、还有其他一些中间件可以自行google、百度、npm了解
    如:
    提供用户鉴权的框架 koa-passport
    token生成jsonwebtoken
    表单验证validator
    全球公认头像gravatar
    ...

    相关文章

      网友评论

          本文标题:koa项目搭建

          本文链接:https://www.haomeiwen.com/subject/hvrgwqtx.html