Express REST API 路由器和 Mongoose 架构设计
Express REST API router and Mongoose schema design
我正在学习如何使用 Mongoose (MongoDB) 创建 REST API。
我正在尝试使用 Mongoose 开发 Express REST API。我想做的很简单,但我不确定用哪种方式来设计 REST API 端点和 Mongoose 模式。
我现在有用户模式,每个用户对象只有用户名和密码。要列出、添加、修改和删除用户,我有一个 /api/users 端点。
models/user.js:
const userSchema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
});
routes/users.js
router.get('/', async (req, res, next) => {
// List all users
});
router.get('/:id', async (req, res, next) => {
// Get user with specified id
});
router.post('/', async (req, res, next) => {
// Create user with given body
});
router.put('/:id', async (req, res, next) => {
// Update user with given id and body
});
router.delete('/:id', async (req, res, next) => {
// Remove user with given id
});
现在,我要做的是让用户拥有文档。他们将能够创建文档、重命名、更改或删除它们。我搜索了如何将这个想法应用到我的 API 中,我发现了 3 个选择。
规范化:创建另一个名为 documents 的 Mongoose 模型,并在用户模型中引用文档。
非规范化(嵌入):在用户模型中添加documents属性,并将每个文档直接添加到用户对象中。
混合:如果我的文档模型有很多属性,我应该单独创建文档模型并提供对用户对象的引用以及存储在用户对象中的必要文档数据。
我的文档模型中不会有很多属性,我想我的文档模型中只需要 path 和 dateCreated 属性.所以,我将使用第一个或第二个选项。我应该使用哪一个?对于这种特殊情况,有没有更好的方法?
我的第二个问题是关于 users.js
用于列出、添加、更改和删除用户文档的路由器端点。我是否应该为这些操作创建另一个路由器文件,如 routers/documents.js
并使用像 /api/documents/
这样的端点?如果是这样,我需要什么终点,比如 router.get('/:userId/'), router.get('/:userId/:documentId')
等?或者我应该在现有用户路由器中添加新的端点,如 /api/users/:id/add_document/, /api/users/:id/documents/
等?
提前致谢。
对于您的第一个问题,请在此处访问我的答案:
embedding vs referencing
对于第二个,我会根据关注点分离模式创建一个单独的路由器文件,并且我会选择关于端点 router.get('/:userId/:documentId')
,因为如果我理解正确的话,每个文档都属于一个用户。
我正在学习如何使用 Mongoose (MongoDB) 创建 REST API。
我正在尝试使用 Mongoose 开发 Express REST API。我想做的很简单,但我不确定用哪种方式来设计 REST API 端点和 Mongoose 模式。
我现在有用户模式,每个用户对象只有用户名和密码。要列出、添加、修改和删除用户,我有一个 /api/users 端点。
models/user.js:
const userSchema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
});
routes/users.js
router.get('/', async (req, res, next) => {
// List all users
});
router.get('/:id', async (req, res, next) => {
// Get user with specified id
});
router.post('/', async (req, res, next) => {
// Create user with given body
});
router.put('/:id', async (req, res, next) => {
// Update user with given id and body
});
router.delete('/:id', async (req, res, next) => {
// Remove user with given id
});
现在,我要做的是让用户拥有文档。他们将能够创建文档、重命名、更改或删除它们。我搜索了如何将这个想法应用到我的 API 中,我发现了 3 个选择。
规范化:创建另一个名为 documents 的 Mongoose 模型,并在用户模型中引用文档。
非规范化(嵌入):在用户模型中添加documents属性,并将每个文档直接添加到用户对象中。
混合:如果我的文档模型有很多属性,我应该单独创建文档模型并提供对用户对象的引用以及存储在用户对象中的必要文档数据。
我的文档模型中不会有很多属性,我想我的文档模型中只需要 path 和 dateCreated 属性.所以,我将使用第一个或第二个选项。我应该使用哪一个?对于这种特殊情况,有没有更好的方法?
我的第二个问题是关于 users.js
用于列出、添加、更改和删除用户文档的路由器端点。我是否应该为这些操作创建另一个路由器文件,如 routers/documents.js
并使用像 /api/documents/
这样的端点?如果是这样,我需要什么终点,比如 router.get('/:userId/'), router.get('/:userId/:documentId')
等?或者我应该在现有用户路由器中添加新的端点,如 /api/users/:id/add_document/, /api/users/:id/documents/
等?
提前致谢。
对于您的第一个问题,请在此处访问我的答案:
embedding vs referencing
对于第二个,我会根据关注点分离模式创建一个单独的路由器文件,并且我会选择关于端点 router.get('/:userId/:documentId')
,因为如果我理解正确的话,每个文档都属于一个用户。