我有一台具有CRUD路由的Express 4服务器供作者使用:
router.get('/authors', AuthorsController.index);
router.post('/authors', AuthorsController.store);
router.get('/authors/:name', AuthorsController.show);
router.put('/authors/:name', AuthorsController.update);
router.delete('/authors/:name', AuthorsController.remove);
我发现大多数教程都将路由设置为/authors/:id
,然后执行Author.findById(req.params.id)
。相反,我希望它是作者的名字,所以有人类可读的URL,例如:/authors/jk-rowling
。
我是否需要将带连字符的字符串存储在Authors模型上,用express和Mongoosejs实现此目的的最佳方法是什么?
我的作者控制器当前如下所示:
const AuthorsController = {
async index(req, res){
const authors = await Author.find().populate('books');
res.send(authors);
}
};
(我正在将express-async-errors包用于带有express的async-await功能)
使用Express和Mongoose为CRUD REST API建立具有人类可读URL的路由的最佳方法是什么?
答案 0 :(得分:2)
您可以为名称字段建立索引,并在视图中按名称查找(假设名称是“作者”的属性)
这不需要更改数据库模型。您可以根据需要通过ID或名称进行搜索。
例如
router.get('/authors/:name', AuthorsController.show);
将具有下面的视图
const AuthorsController = {
async show(req, res){
const authors = await Author.find({'name':req.params.name}).populate('books');
res.send(authors);
}
};
正如您在问题中提到的那样,您将必须为名称生成 slug ,例如包含连字符的名称,以代替空格或其他特殊字符,也将存储在模型中。