Lesson-1 个人资料需求分析
浏览知乎个人资料页
这个就不演示了吧,直接去知乎进入个人资料页
个人资料功能点
- 不同类型(如字符串、数组)的属性
- 字段过滤
Lesson-2 个人资料的 schema 设计
操作步骤
- 分析个人资料的数据结构
- 设计个人资料的 schema
分析&设计 schema
// models/users.js
const mongoose = require('mongoose');
const { Schema, model } = mongoose;
const userSchema = new Schema({
__v: { type: Number, select: false },
name: { type: String, required: true },
password: { type: String, required: true, select: false },
avatar_url: { type: String }, // 用户头像
gender: { type: String, enum: ['male', 'female'], default: 'male', required: true }, // enum 可枚举,性别
headline: { type: String }, // 一句话简介
locations: { type: [{ type: String }] }, // 可枚举的字符串数组,居住地
business: { type: String }, // 公司
employments: { // 职业经历
type: [{
company: { type: String },
job: { type: String }
}]
},
educations: { // 教育经历
type: [{
school: { type: String },
major: { type: String },
diploma: { type: Number, enum: [1, 2, 3, 4, 5] },
entrance_year: { type: Number },
graduation_year: { type: Number }
}]
}
});
// user代表集合,导出的是一个类
module.exports = model('user', userSchema);
Lesson-3 个人资料的参数校验
操作步骤
- 分析个人资料的数据结构
- 编写代码校验个人资料参数
- 使用 Postman 测试
分析&编写代码校验个人资料参数
这里可能有人会认为,应该创建用户和修改用户这两个方法都去校验,实际并非如此。因为想一想我们日常很多软件,其实注册只需要少量必要数据即可,大部分数据都是注册成功后才去个人中心自己修改的,所以只需要修改用户资料这个接口进行校验即可
// controllers/users.js
async update (ctx) {
ctx.verifyParams({
name: { type: 'string', required: false },
password: { type: 'string', required: false },
avatar_url: { type: 'string', require: false },
gender: { type: 'string', require: false },
headline: { type: 'string', require: false },
locations: { type: 'array',itemType: 'string', require: false },
business: { type: 'string', require: false },
employments: { type: 'array',itemType: 'object', require: false },
educations: { type: 'array',itemType: 'object', require: false }
});
// findByIdAndUpdate,第一个参数为要修改的数据id,第二个参数为修改的内容
const user = await User.findByIdAndUpdate(ctx.params.id, ctx.request.body);
if(!user) ctx.throw(404, '用户不存在');
ctx.body = user;
}
使用 Postman 测试
Lesson-4 RESTful API 最佳实践 -- 字段过滤
操作步骤
- 设计 schema 默认隐藏部分字段
- 通过查询字符串显示隐藏字段
- 使用 Postman 测试
设计 schema 默认隐藏部分字段
前面也已经做过一次了,也就是在schema把对应的属性添加 select: false,所以这里就是根据github上的来把某些字段默认隐藏掉,至于为什么…因为github是RESTFul api 的教科书级别接口,所以跟着它来
// models/users.js
const userSchema = new Schema({
__v: { type: Number, select: false },
name: { type: String, required: true },
password: { type: String, required: true, select: false },
avatar_url: { type: String }, // 用户头像
gender: { type: String, enum: ['male', 'female'], default: 'male', required: true }, // enum 可枚举,性别
headline: { type: String }, // 一句话简介
locations: { type: [{ type: String }], select: false }, // 可枚举的字符串数组,居住地
business: { type: String, select: false }, // 公司
employments: { // 职业经历
type: [{
company: { type: String },
job: { type: String }
}],
select: false
},
educations: { // 教育经历
type: [{
school: { type: String },
major: { type: String },
diploma: { type: Number, enum: [1, 2, 3, 4, 5] }, // 文凭:初中,高中,大专,本科,本科以上
entrance_year: { type: Number },
graduation_year: { type: Number }
}],
select: false
}
});
通过查询字符串显示隐藏字段
这里需要使用query来查询url上的参数(同样是别名,自行查看koa文档),我们需要实现的是通过url上的参数,来指定显示哪些隐藏字段,比如localhost:3000/users/5d4ee0e680a51e07a45b7175?fields=business;locations
,那么这样就会把business和locations给显示出来,这里只给查找特定用户添加该方法,至于如何强制选择,记得之前写过了,不过这里还是再发一次,自己也记不得写过没,参考 Mongoose 文档 query_Query-select
// controllers/users.js
async findById (ctx) {
const { fields } = ctx.query;
// 分割,并剔除空的fields,比如直接写fields=;这个时候应该返回一个空数组
const selectFields = fields.split(';').filter(item => item).map(item => ' +'+item).join('');
const user = await User.findById(ctx.params.id).select(selectFields);
if(!user) ctx.throw(404, '用户不存在');
ctx.body = user;
}