У меня есть Rest API, где пользователь может создать список, а затем поместить в него элементы списка (для викторины). Моя структура схемы такова:
const verbListSchema = {
title: String,
verbs: [{verb: String}]
};
Вот конечные точки URL, которые у меня есть до сих пор:
/lists/ (gets back all the lists)
/lists/verbs (gets all the verbs from all the lists)
Мой вопрос: я хочу получить, опубликовать, исправить и удалить определенный список, используя его идентификатор, например /lists?list_id=123/verbs
или /lists/123/verbs
, а затем еще один шаг, чтобы получить отдельные глаголы. Я хочу сделать что-то вроде /lists/123/verbs/124
или /lists?list_id=123/verbs?verb_id=124
, последнее не работает, потому что он считает последнюю конечную точку параметром запроса.
С точки зрения передовой практики, как лучше всего это сделать. Я мог бы сделать что-то подобное (я использую express.js)?
app.[request-type]("/lists") {...}
app.[request-type]("/lists/:list_id") {...}
app.[request-type]("/lists/:list_id/verbs") {...}
app.[request-type]("/lists/:list_id/verbs/:verb_id") {...}
а затем, если я хочу получить все списки, а не только конкретный, я могу проверить, соответствует ли list_id /lists/all/verbs
?
И вот мой код до сих пор:
const express = require("express");
const verbRouter = require("./verbRoutes");
const router = express.Router();
const VerbList = require("../../verb-list-db");
const isOriginal = async (req,res,next) => {
const listExists = await VerbList.find({title: req.body.listTitle})
if (listExists.length > 0 ) return res.status(400).json({message: "list already exists"});
next();
};
router.route("/")
.get(async (req,res,next) => {
try {
const listId = req.query.list_id;
if (listId) return res.json(await VerbList.find({_id: listId}));
const lists = await VerbList.find({});
res.json(lists);
} catch(err) {next(err)}
})
.post(isOriginal, async (req,res,next) => {
const newList = new VerbList({ // creates a new list
title: req.body.listTitle
})
newList.save()
.then(() => {return res.send("list successfully added!")})
.catch(err => next(err));
})
.patch(isOriginal, async (req,res,next) => {
try {
const listId = req.query.list_id;
if (!listId) throw new Error("you must have a list_id to patch!")
res.json(await VerbList.updateOne({_id: req.query.list_id}, {title: req.body.listTitle}))
} catch(err) {next(err)}
})
.delete(async (req,res,next) => {
try {
const listId = req.query.list_id;
if (!listId) throw new Error("you must have a list_id to delete!");
res.json(await VerbList.deleteOne({_id: req.query.list_id}))
} catch(err) {next(err)}
})
Мы ценим любые предложения :)