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 启动服务
koa2搭建服务器的更多相关文章
- koa2搭建服务器+使用mongoose链接mangodb
使用node搭建服务器,用到了现在比较流行的框架koa. 1.初始化package.json npm init -y 2.安装koa2 npm i koa --save 3.搭建服务器 const K ...
- Nodejs -- 使用koa2搭建数据爬虫
当前爬虫项目开发所需中间件: cheerio: 则能够对请求结果进行解析,解析方式和jquery的解析方式几乎完全相同 cheerio中文文档 开发参考node - cheerio模块 superag ...
- iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks
视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 代码分层
视频地址:https://www.cctalk.com/v/15114923889408 文章 在前面几节中,我们已经实现了项目中的几个常见操作:启动服务器.路由中间件.Get 和 Post 形式的请 ...
- Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端
要搞一个小型的cms内容发布系统 因为小程序上线之后,直接对数据库进行操作的话,慧出问题的,所以一般都会做一个管理系统,让工作人员通过这个管理系统来对这个数据库进行增删改查 微信小程序其实给我们提供了 ...
- 利用ADSL拨号上网方式如何搭建服务器
序:搭建服务器需要两个条件硬件服务器和固定公网IP,随便一台个人电脑都可以作为硬件服务器,就剩下一个问题,如何获得一个固定公网IP. 第一章 扫盲:ADSL拨号上网方式,本地IP与公网IP的区别 一. ...
随机推荐
- 使用setx 命令添加环境变量(Windows)
背景 用GUI的方法可能添加环境变量可能会比较麻烦,为此可采用命令行操作的方式. 步骤 以管理员身份运行 cmd 输入 setx /M "%path%" "%path%[ ...
- [leetcode]8. String to Integer (atoi)字符串转整数
Implement atoi which converts a string to an integer. The function first discards as many whitespace ...
- Solidity的地址 数组如何判断是否包含一个给定的地址?
Q: given address[] wallets. What is the correct method to check that the list contains a given addre ...
- Python开发——数据类型【数字】
布尔型 bool型只有两个值:True 或 False 我们将bool值归类为数字,习惯上:1表示true,0表示false 整型 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2* ...
- MySQL开发——【高级操作、五子句】
高级新增操作 ①基本插入操作: insert into 数据表名称(字段) values (值); ②批量插入操作: insert into 数据表名称(字段) values (值1),(值2),(值 ...
- Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...
- javascript的异步编程
同步与异步 介绍异步之前,回顾一下,所谓同步编程,就是计算机一行一行按顺序依次执行代码,当前代码任务耗时执行会阻塞后续代码的执行. 同步编程,即是一种典型的请求-响应模型,当请求调用一个函数或方法后, ...
- Spring AOP配置方式
AOP 面向切面编程,允许在 java 应用中的方法调用的前后做一些处理. 本文通过实例介绍两种主要的Spring AOP 配置方式:xml 方式配置,注解方式配置 XML 方式配置 1. 项目包类结 ...
- python函数(一)
python函数(一) 1.函数的定义: def test(): print('test is running...') return 定义一个函数,有3个部分需要注意: 函数名称.函数的命名规范与变 ...
- Maths | 相关接收机与最大似然准则
目录 一. 接收机的概念 1.信号解调器 2.检测器 二. 相关解调器的解调过程及其原理 1.构造相关解调器 2.得到接收信号在基向量上的投影 3.相关器输出的性质 三.检测器的实现及其数学原理 1. ...