Node.js-如何在Express和Mongoose中按名称路由?

时间:2019-07-31 04:44:51

标签: javascript node.js mongodb express mongoose

我有一台具有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的路由的最佳方法是什么?

1 个答案:

答案 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 ,例如包含连字符的名称,以代替空格或其他特殊字符,也将存储在模型中。