koa项目搭建

2019-04-17  本文已影响0人  风之伤_3eed

一、初始化项目

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

上一篇下一篇

猜你喜欢

热点阅读