本文转载自https://segmentfault.com/a/1190000019155991
使用 koa-generator 脚手架工具
npm install koa-generator -g #全局安装
koa2 demo #创建demo项目
cd demo && npm install #安装依赖
默认生成项目结构如下
用脚手架生成的项目,默认是服务器渲染,即响应的是html视图。而我们要开发接口,响应的是json数据。所以要删除渲染视图的代码。增加响应json的配置。
首先删除views文件夹,接下来就是修改 app.js
以下是要删除的代码
const views = require('koa-views')
app.use(views(__dirname + '/views', {
extension: 'pug'
}))
routes文件夹读取文件const fs = require('fs')
fs.readdirSync('./routes').forEach(route=> {
let api = require(`./routes/${route}`)
app.use(api.routes(), api.allowedMethods())
})
const jwt = require('koa-jwt')
app.use(jwt({ secret: 'yourstr' }).unless({
path: [
/^\/$/, /\/token/, /\/wechat/,
{ url: /\/papers/, methods: ['GET'] }
]
}));
// error
app.use(async (ctx, next) => {
try {
await next()
} catch(err) {
ctx.status = err.statusCode || err.status || 500;
ctx.body = err.message
ctx.app.emit('error', err, ctx);
}
})
当接口发布到线上,前端通过ajax请求时,会报跨域的错误。koa2使用koa2-cors这个库非常方便的实现了跨域配置,使用起来也很简单
const cors = require('koa2-cors');
app.use(cors());
我们使用mongodb数据库,在koa2中使用mongoose这个库来管理整个数据库的操作。
根目录下新建config文件夹,新建mongo.js
// config/mongo.js
const mongoose = require('mongoose').set('debug', true);
const options = {
autoReconnect: true
}
// username 数据库用户名
// password 数据库密码
// localhost 数据库ip
// dbname 数据库名称
const url = 'mongodb://username:password@localhost:27017/dbname'
module.exports = {
connect: ()=> {
mongoose.connect(url,options)
let db = mongoose.connection
db.on('error', console.error.bind(console, '连接错误:'));
db.once('open', ()=> {
console.log('mongodb connect suucess');
})
}
}
然后在app.js中引入
const mongoConf = require('./config/mongo');
mongoConf.connect();
连接数据库完成!
mongoose有两个核心概念,Schema和Model。Schema是预先定义的数据库模型骨架,定义集合存储的数据结构;Model是依据Schema构造生成的模型,有数据库操作的能力。
下面是案例,新建一个用户集合:
根目录下新建models文件夹,新建users.js
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
const Schema = mongoose.Schema
const ObjectId = mongoose.Types.ObjectId
// Schema
const usersSchema = new Schema({
_id: { type: ObjectId }, // 默认生成,不加也可以
username: { type: String, required: [true,'username不能为空'] },
sex: { type: String, enum: ['man','woman'], required: [true,'sex不能为空'] },
age: { type: Number required: [true,'age不能为空'] },
avatar: { type: String, default: '' }
})
// Model
const users = mongoose.model('users',usersSchema);
module.exports = users;
这样,一个用户集合的model就建好了,接下来在路由中直接引入这个model,就可以进行数据库操作了
按照app.js的配置,routes文件夹下每一个文件都要注册成为一个路由
一个基本的, RESTful风格的用户增查改删接口路由文件如下,包含了增查改删的通用写法
const router = require('koa-router')()
router.prefix('/users')
router.get('/', function (ctx, next) {
ctx.body = '获取所有用户'
})
router.get('/:id', function (ctx, next) {
let id = ctx.params.id
ctx.body = '获取单个用户'
})
router.post('/', function (ctx, next) {
let data = ctx.request.body
ctx.body = '新增用户'
})
router.put('/:id', function (ctx, next) {
let id = ctx.params.id
ctx.body = '修改用户信息'
})
router.delete('/:id', function (ctx, next) {
let id = ctx.params.id
ctx.body = '删除用户'
})
module.exports = router
任何一次请求接口传来的参数,首先要在最前面做一次参数验证。如果请求参数不合法,那么直接返回错误信息,无需继续走下面的业务逻辑。
参数验证,推荐使用 Joi 这个库,它是 hapijs 内置的参数验证模块,也是使用Schema定义数据结构。
比如创建用户接口,对用户传来的数据进行验证
const Joi = require('joi')
router.post('/', function (ctx, next) {
let data = ctx.request.body
let schema = Joi.object().keys({
username: Joi.string().required(),
sex: Joi.string().required(),
age: Joi.number().required()
})
let result = Joi.validate(data, schema);
if(result.error) {
return ctx.body = result.error.details
}
let reqdata = result.value; #经过验证后的数据
})
这样就完成了一个简单的验证,具体验证请看joi文档
之前已经创建了users的model,现在我们可以直接在路由文件中使用该模块,进行数据库操作
// 引入上一步创建的model
const Users = require('../models/users');
router.get('/', async (ctx, next)=> {
ctx.body = await Users.find()
})
router.get('/:_id', async (ctx, next)=> {
let _id = ctx.params._id
ctx.body = await Users.findOne({_id})
})
// 创建用户
router.post('/', async (ctx, next)=> {
let data = ctx.request.body
ctx.body = await Users.create(data)
})
router.put('/:_id', async (ctx, next)=> {
let _id = ctx.params._id
let data = ctx.request.body
ctx.body = await Users.update({_id}, { $set: data }, {
runValidators: true
})
})
router.delete('/:_id', async (ctx, next)=> {
let _id = ctx.params._id
ctx.body = await Users.deleteOne({_id})
})
这是基本的增查改删的操作。这里用到了koa2最大的亮点,就是async,await异步处理方案。只要await 后面返回的是 promise,就可以直接使用。这比在 express 框架上使用 then 方法处理要优雅的多的多。
上一步讲的请求参数验证,是第一层验证。其实在model操作中,数据进入数据库时,也会进行一层验证,就是mongoose的Schema定义的数据类型和字段,如果不匹配,则会拒绝写入并返回错误。这就是mongoose的好处之一,可以防止写入不规范的数据。
这里不做mongoose的详解,附上文档地址:mongoose
应用启动文件是 www/bin,所以我们可以通过 node www/bin 开启动应用,默认是9000端口。
这样启动会有一个问题,就是在修改代码之后,程序不会自动运行最新的代码,需要手动断开重新启动。
pm2的诞生就是用来解决这个问题。他是一个nodejs应用程序管理器,通过pm2启动nodejs应用,开启监听模式,它就可以自动监听文件变化重启应用。
当然pm2的作用还有很多,首先启动应用:
pm2 start --name koa2 bin/www --watch
结果如下:
然后可以删除或重启:
pm2 list # 查看进程列表
pm2 restart koa2 # 重启名称为koa2的应用
pm2 delete koa2 # 删除名称为koa2的进程
pm2 logs koa2 # 查看名称为koa2的进程日志
koa2应用在linux服务端部署,首先需要pm2来启动应用。但是koa2项目启动一般不使用80端口,所以在线上部署时,还需要nginx做反向代理以及域名配置。
配置如下:
server {
listen 80;
server_name api.xxxxx.com;
location / {
proxy_pass http://127.0.0.1:9000;
#兼容scoket.io
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
这样访问 api.xxxxx.com 就能访问koa2的应用了!
如果是https,需要修改下配置:
server {
listen 80;
server_name api.xxxxx.com;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 443 ssl;
server_name api.ruidoc.com;
ssl on;
ssl_certificate 1_api.xxxxx.com_bundle.crt; #ssl证书
ssl_certificate_key 2_api.xxxxx.com.key;
location / {
proxy_pass http://127.0.0.1:9000;
#兼容scoket.io
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
此时你可以上传你的应用了!
一般上传源码的时候,可能会用ftp服务之类的。如果是Mac用户,那么可以配置一条快捷命令,直接上传,方便省事
rsync -avz ./* root@1.23.45.67:/home/api
root 是服务器用户名;
1.23.45.67 是服务器IP地址;
/home/api 是源码在服务器的存放路径
然后输入服务器密码,就可以快速上传了,而且只会上传修改过的源码,非常快速。
还可以将命令配置到package.json文件的scripts下,如
"scripts": {
"upload": "rsync -avz ./* root@1.23.45.67:/home/api"
}
此时你可以这样上传:
npm run upload
这样配置上传效率非常高,一起试试吧!
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
Ocra无法处理需要“tk”的应用程序require'tk'puts'nope'用奥克拉http://github.com/larsch/ocra不起作用(如链接中的一个问题所述)问题:https://github.com/larsch/ocra/issues/29(Ocra是1.9的"new"rubyscript2exe,本质上它用于将rb脚本部署为可执行文件)唯一的问题似乎是缺少tcl的DLL文件我不认为这是一个问题据我所知,问题是缺少tk的DLL文件如果它们是已知的,则可以在执行ocra时将它们包括在内有没有办法知道tk工作所需的DLL依赖项? 最佳答
我有一个类unzipper.rb,它使用Rubyzip解压文件。在我的本地环境中,我可以成功解压缩文件,而无需使用require'zip'明确包含依赖项但是在Heroku上,我得到一个NameError(uninitializedconstantUnzipper::Zip)我只能通过使用明确的require来解决问题:为什么这在Heroku环境中是必需的,但在本地主机上却不是?我的印象是Rails自动需要所有gem。app/services/unzipper.rbrequire'zip'#OnlyrequiredforHeroku.Workslocallywithout!class