koa2搭建服务器

  • 首先初始化项目

npm init -y

  • 安装koa2

    npm install koa --save

  • 项目根目录 新建 index.js

//这是最基本的服务
const Koa = require('koa');
const app = new Koa();

app.use(async(ctx)=>{
	ctx.body = '<h1>hello world</h1>'
});
app.listen(3000,()=>{
	console.log('[server]started at port 3000....')
})
  • 本地安装mongodb数据库。

  • 添加环境变量 ,按提示创建文件夹。 data/db/

  • 安装 robo3数据库可视化工具。

  • 安装mongoose

npm install mongoose --save

  • 创建 database文件夹,schema文件夹 ,初始化连接数据库文件 init.js
npm install --save bcrypt  

schema 文件如下

const  bcrypt = require('bcrypt');
const SALT_WORK_FACTOR = 10;  //加盐位数

//创建User Schema
const userSchema = new Schema({
	UserId: ObjectId,
	userName:{unique:true,type:String },
	password:{type:String},
	createAt:{type:Date,default:Date.now()},
	lastLogin:{type:Date,default:Date.now()}
},{collection:'user'})

userSchema.pre('save',function(next){
	bcrypt.genSalt(SALT_WORK_FACTOR,(err,salt)=>{
		if(err) return next(err);
		bcrypt.hash(this.password,salt,(err,hash)=>{
			if(err) return next(err)
			this.password = hash;
			next();
		})
		
	})
});
//发布模型
mongoose.model('User',userSchema);

init.js

const mongoose = require('mongoose');
const db = 'mongodb://localhost/simle-db';

const glob = require('glob'); //需要安装
const { resolve } = require('path');  //node内置

exports.initSchemas = () => {
	glob.sync(resolve(__dirname,'./schema','**/*.js')).forEach(require)

}

exports.connect = () => {
	//连接数据库
	mongoose.connect(db);
	let maxConnectTimes = 0;
	return new Promise((resolve,reject)=>{
		
		//增加数据库监听事件  断开连接
		mongoose.connection.on('disconnected',()=>{
			console.log('*****数据库断开')
			if(maxConnectTimes < 3){
				mongoose.connect(db)
				maxConnectTimes++;
			}else{
				reject();
				throw new Error('数据库出现问题...')
			}
			
		// 错误
		})
		mongoose.connection.on('error',(err)=>{
			console.log('*****数据库错误')
			if(maxConnectTimes < 3){
				mongoose.connect(db)
				maxConnectTimes++;
			}else{
				reject(err);
				throw new Error('数据库出现问题...')
			}
		})
		
		//链接打开时
		mongoose.connection.once('open',()=>{
			console.log('mongDB connected successfully...  ')
			resolve();
		})
	})
}

  • 在index.js下自执行
const { connect ,initSchemas } = require('./database/init.js');
;(async ()=>{
	await connect();
	initSchemas();	
})()
  • 安装路由,分模块
npm install --save koa-router
const Router = require('koa-router');
let user = require('./appApi/user.js');
let home = require('./appApi/home.js');


// 装载所有子路由
let router = new Router();
router.use('/user',user.routes())
router.use('/home',home.routes())

// 加载路由中间件
app.use(router.routes())
app.use(router.allowedMethods())
  • 安装koa-bodyparser和 koa2-cors,解决参数和跨域问题
npm install --save koa-bodyparser koa2-cors
//index.js
// 接收请求的中间件
const bodyParser = require('koa-bodyparser');
// 支持跨域的中间件
const cors = require('koa2-cors');
const bodyParser = require('koa-bodyparser');
// 支持跨域的中间件
const cors = require('koa2-cors');

//这两个是需要放到其他app.use操作之前才生效
app.use(bodyParser())
app.use(cors())

  • 根目录新建 api文件夹,分模块写接口,比如 user.js

const Router = require('koa-router');
let router = new Router();
const mongoose = require('mongoose');

router.get('/',async(ctx)=>{
	ctx.body= "这是用户操作首页"
})

router.post('/register',async(ctx)=>{
// 	console.log('------11')
// 	console.log(ctx.request.body);
// 	console.log('------11')
// 	ctx.body = ctx.request.body;

	//取得model
	const User = mongoose.model('User');
	
	//把从前端接收的POST数据封装成一个新的user对象
	let newUser = new User(ctx.request.body);
	
	//使用mongoose的save方法直接存储,然后判断是否成功
	await newUser.save().then(()=>{
		//保存成功 返回code == 200,并返回成功信息
		
		ctx.body = {
			code : 200,
			msg:"注册成功"
		}
	}).catch(error =>{
		//失败返回 code = 500,返回错误信息
		ctx.body = {
			code: 500,
			message:error
		}
	})
	
})

module.exports = router;
  • node index.js 启动服务
posted @ 2019-04-10 15:38  橙云生  阅读(1830)  评论(0编辑  收藏  举报