Dear,大家好,我是“前端小鑫同学”,😇长期从事前端开发,安卓开发,热衷技术,在编程路上越走越远~
作为一个Coder虽然主要在做前端方面的开发,但是为了可以更好的协作开发,还是很有必要学习后端的一些知识,最起码你可以了解到什么东西是真的实现不了😏。
我们可以通过eggjs提供的脚手架生成一套完整的项目结构,这对于我们快速学习将是非常有必要的,接下来我们就一起了解一下eggjs基础项目的的结构,对于初次使用我们就只关注如下的目录即可。
this
指针结构到ctx
上下文对象,并将要返回的内容赋值给body
,接着我们在router.js
中增加router.get('/', controller.home.index);
就可以启动服务后在浏览器访问IP:PORD
得到3号标题的内容了。'use strict';
const Controller = require('egg').Controller;
class HomeController extends Controller {
async index() {
const { ctx } = this;
ctx.body = '<h3>欢迎使用可追溯查询数据提供服务</h3>';
}
}
module.exports = HomeController;
复制代码
router.post('/dev-api/user/login', controller.user.login);
router.get('/dev-api/user/info', controller.user.info);
router.post('/dev-api/user/logout', controller.user.logout);
复制代码
// server\config\plugin.js
exports.mongoose = {
enable: true,
package: 'egg-mongoose',
};
exports.validate = {
enable: true,
package: 'egg-validate',
};
exports.cors = {
enable: true,
package: 'egg-cors',
};
复制代码
// server\config\config.default.js
module.exports = appInfo => {
...
config.cors = {
origin: '*', // 表示允许的源
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH', // 表示允许的http请求方式
};
return {
...
security: {
csrf: {
enable: false,
},
},
bodyParser: {
jsonLimit: '5mb', // 允许传输内容的大小限制
formLimit: '5mb',
},
mongoose: {
client: {
url: 'mongodb://<这块有时间单独说,各位先百度也行>',
options: {
autoReconnect: true,
reconnectTries: Number.MAX_VALUE,
bufferMaxEntries: 0,
},
},
},
};
};
复制代码
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const UserSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
roles: { type: Array, required: true },
introduction: { type: String, required: true },
avatar: { type: String, required: true },
name: { type: String, required: true },
}, { timestamps: true });
return mongoose.model('User', UserSchema);
};
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const TokenSchema = new Schema({
token: { type: String, required: true },
}, { timestamps: true });
return mongoose.model('Token', TokenSchema);
};
复制代码
BaseController
,将统一处理接口的返回格式:'use strict';
const Controller = require('egg').Controller;
class BaseController extends Controller {
success(data) {
this.ctx.body = {
code: 20000,
data,
};
}
message(message) {
this.ctx.body = {
code: 20000,
message,
};
}
error(message, code = -1, errors = {}) {
this.ctx.body = {
code,
message,
errors,
};
}
}
module.exports = BaseController;
复制代码
Controller
的编写了,继承自BaseController
,并导入了加密、鉴权,也定义了操作校验的对象loginUserRule
:'use strict';
const BaseController = require('./base');
const KEY = require('../key');
const jwt = require('jsonwebtoken');
const md5 = require('md5');
const loginUserRule = {
username: { type: 'string' },
password: { type: 'string' },
};
class UserController extends BaseController {
async login() {
const { ctx } = this;
}
async info() {
const { ctx } = this;
}
async logout() {
const { ctx } = this;
}
}
module.exports = UserController;
复制代码
const { ctx } = this;
try {
ctx.validate(loginUserRule);
} catch (e) {
return this.error('参数校验失败', -1, e.errors);
}
复制代码
request
对象的body
属性得到请求中的用户名和密码;const { username, password } = ctx.request.body;
const ret = await ctx.model.User.findOne({ username });
if (ret.password && ret.password === md5(password)) {
const token = jwt.sign({ username }, KEY.secretOrPrivateKey);
const tokenRet = await ctx.model.Token.create({
token,
});
if (tokenRet._id) {
this.success({ token });
}
} else {
this.error('用户名或密码错误');
}
复制代码
const token = ctx.request.header['x-token'];
const ret = await ctx.model.Token.findOne({ token });
if (ret) {
const { username } = jwt.verify(token, KEY.secretOrPrivateKey);
const userRet = await ctx.model.User.findOne({ username });
if (userRet) {
this.success(userRet);
}
}
复制代码
const token = ctx.request.header['x-token'];
const ret = await ctx.model.Token.findOne({ token });
if (ret) {
const tokenRet = await ctx.model.Token.deleteOne({ token });
if (tokenRet && tokenRet.ok === 1) {
this.success('success');
}
} else {
this.error('服务器暂无在线记录');
}
复制代码
至此我们就已经实现了一个最简单的App中用户的基本操作(登录,信息获取,登出)的功能,当然在实际的业务中将更为复杂。
这个流程下来,其实涉及的知识点还不少,比如说MongoDB的存取操作,JWT的生成验证,还有统一个数据结构应用的必要等,没有为自己App提供过服务的Coder们,一起来试试吧。