Open soonfy opened 6 years ago
在 app/controller
中新建一个文件 user.js
并且定义 controller 类
'use strict';
const Controller = require('egg').Controller;
class UserController extends Controller {
async info() {
this.ctx.body = 'user router';
}
}
module.exports = UserController;
在 app/router.js
定义路由规则
router.get('/user/', controller.user.info);
soonfy
以egg-mongoose 为例
安装 package
npm i -D egg-mongoose
配置 config/plugin.js
exports.mongoose = {
enable: true,
package: 'egg-mongoose',
};
配置 config/config.default.js
config.mongoose = {
client: {
url: 'mongodb://localhost/social_development',
options: {
// mongos: true,
server: {
socketOptions: { keepAlive: 1, autoReconnect: true },
reconnectTries: 600,
reconnectInterval: 1000,
},
},
},
};
定义 schema,model
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const UserSchema = new Schema({
name: String,
});
return mongoose.model('User', UserSchema, 'users');
};
在 controller或者service使用
let data = await this.ctx.model.User.find({ name });
soonfy
在 app/service
新建 user.js
定义 service
const Service = require('egg').Service;
class UserService extends Service {
async find(name) {
const users = await this.ctx.model.User.find({ name });
return users;
}
async remove(name) {
const res = await this.ctx.model.User.remove({ name });
return res;
}
}
module.exports = UserService;
在 controller 使用 service
async info() {
const name = await this.ctx.service.user.find('name');
this.ctx.body = name;
}
soonfy
定义定时任务,在 app/schedule
新建 update.js
const Subscription = require('egg').Subscription;
class Update extends Subscription {
// 通过 schedule 属性来设置定时任务的执行间隔等配置
static get schedule() {
return {
// interval: '1m', // 1 分钟间隔
cron: '0 0 */3 * * *',
type: 'all', // 指定所有的 worker 都需要执行
};
}
// subscribe 是真正定时任务执行时被运行的函数
async subscribe() {
const res = await this.ctx.curl('http://www.api.com/cache', {
dataType: 'json',
});
this.ctx.app.cache = res.data;
}
}
module.exports = Update;
soonfy
在 app/extend
新建 js 文件
application, context, request, response
扩展方法,属性 application
const NAME = Symbol('Application#name');
module.exports = {
// 扩展方法
log(params) {
console.log(params);
},
// 扩展获取属性
get name() {
if (!this[NAME]) {
this[NAME] = this.config.name;
}
return this[NAME];
},
};
context
const NAME = Symbol('Application#name');
module.exports = {
// 扩展方法
log(params) {
console.log(params);
},
// 扩展获取属性
get name() {
if (!this[NAME]) {
this[NAME] = this.get('ua');
}
return this[NAME];
},
};
soonfy
Error: nodejs.ForbiddenError: invalid csrf token 解决:在 config 文件添加配置
config.security = { csrf: { enable: false, }, };
soonfy
以 koa-jwt 为例
在 app/middleware
新建 jwt.js
文件
'use strict';
module.exports = require('koa-jwt');
在 config/config.default.js
中配置 jwt 插件
config.middleware = [ 'jwt' ];
config.jwt = {
secret: 'secret', // 插件参数
// passthrough: true,
enable: true, // 控制中间件是否开启
match: [], // 设置只有符合某些规则的请求才会经过这个中间件
ignore: [ '/wxapi/' ], // 设置符合某些规则的请求不经过这个中间件
};
soonfy
以 jsonwebtoken 为例
在 app/middleware
新建 jsonwebtoken.js
文件
'use strict';
module.exports = require('jsonwebtoken');
在相应的 controller 上使用 jsonwebtoken
resp.token = this.app.middleware.jsonwebtoken.sign({
userId: resp.userInfo._id,
exp: Math.floor(Date.now() / 1000) + 60 * 60,
}, this.config.jwt.secret);
soonfy
find() 方法的第二个参数 projection 只有在对应的 controller 才有用。
service/user
定义的projection
只有在controller/user
中使用才有效果。
soonfy
> 对象属性覆盖,必须重写属性,不能空
// config.default.js
config.jwt = {
enable: true,
passthrough: true
}
// config.prod.js
// cover, no passthrough error
config.jwt = {
enable: true,
passthrough: false
}
soonfy
初始化项目 egg-init
soonfy