• 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 启动服务
  • 相关阅读:
    #{}和${}的区别
    Shiro 的优点
    SpringSecurity 和 Shiro的之间的比较
    shiro的组件
    Apache Shiro 的三大核心组件
    Maven的工程类型有哪些?
    Maven仓库是什么
    什么是Maven?
    shiro有哪些组件?
    Apache Shiro 的三大核心组件
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/10683770.html
Copyright © 2020-2023  润新知