undownding/typescript-examination

Typescript 实操题目

★ 0Forks 0GitHub ↗Compare

README

Typescript 实操题目

大纲

本题目旨在考察解决问题的能力,分为实操与问答两部分。

最终交付时,期望交付一份符合需求、可构建运行的代码,并将问答部分的答案以 markdown 文档形式附在工程目录中交付。

问答部分即使没法给出实现的方案,亦期望看见问题产生的原因、解决问题的思路。只要能提供思路或方案,实现的的代码可以不需给出,或只给出必要部分。

任务需求

使用 Typescript 实现一个 API 服务器,满足用户注册/登录等基础功能。包含以下接口:

Method Path Description
POST /auth/sign-up 使用用户名和密码注册,注册后返回 Token
POST /auth/sign-in 使用用户名和密码登录,登录后返回 Token
GET /users/me 获取当前登录用户的信息
GET /dashboard 返回任意 JSON 数据
GET /users/:username 根据用户名获取用户信息
PATCH /users/me/username 修改当前用户的用户名
PATCH /users/me/password 修改当前用户的密码
PUT /users/me/avatar 上传头像,详细需求见下文

技术要求

  • 使用任意 web 框架实现以上 API;
  • 注册用户后,用户信息写入到数据中的 users 表中,且密码不使用明文保存;
  • 以 PUT 方式将头像上传到服务器后,将上传条目写入到数据库的 uploads 表,并将该用户的 avatarId 列以外键关联到 uploads 表的 id;
  • 使用 SQLite 数据库保存以上两个表的数据;
  • 使用任意测试框架为该 API 服务编写测试用例(尽量使用 e2e test),覆盖率要求至少达到50%,测试时需要确实有数据库写入操作,且不受开发数据库的干扰,多次跑 test 的结果保持一致。

问答部分

  1. 上传头像这个功能如何防止被恶意利用?
  2. 部署到服务器后,前端页面请求该项目的接口出现 CORS 错误,应该如何解决?
  3. 如何防止该 API 服务器的接口被机器人穷举,或被重放攻击?
  4. 当项目升级需要将该项目从 CommonJS 改成 ES Module 时,该工程的配置和代码应作哪些修改?
  5. 当删除 uploads 表中某个条目时,该条目作为头像已被现有的 user 引用,导致删除失败。该问题的原因是什么?业务层面该做哪些改动?
  6. 若该项目希望日后迁移到其他关系型数据库(如 MySQL / PostgresSQL),或者说希望这套代码能同时在 SQLite 或其他数据库上都能跑,那么工程层面应该怎么设计合适?
  7. 我希望在登录或进行敏感操作时,需要 TOTP 进行二步验证才能进一步操作(即:登录后未经 TOTP 验证只能请求 /users/me,修改用户名/修改密码时必须经过 TOTP 验证才能操作)。应该如何实现?
  8. 阐述 “使用 Passkey 登录” 的原理和实现思路。

Contributors

undownding

Issues