Section-9 项目实战之个人资料模块

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 测试

postman校验
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;
}

你可能感兴趣的:(Section-9 项目实战之个人资料模块)