Node.js 相同的 uri 但不同的参数

Node.js same uri but different parameters

我正在用 Node.js 和 express 做一个简单的库 API。要获取具有 ISBN 的特定书籍或特定类型的书籍,我有以下功能:

/api/books/isbn

router.get('/:isbn', function (req, res) 
{
  var isbn = req.params.isbn
})

/api/books/query

router.get('/:genre', function (req, res) 
{
  var genre = req.params.isbn
})

所以首先,这是行不通的,因为无论输入是什么,它都只会转到第一个函数。我尝试过的另一件事是只制作一个提取查询参数的函数:

router.get('/', function (req, res) 
{
  var isbn = req.query.isbn
  var genre = req.query.genre
})

使用这种方法,我可以通过调用 /api/books?genre=Adventure 或 /api/books?isbn=1231230912

来获得不同的值

但我觉得第一种方式更有意义,即 /api/books/adventure/api/books/isbn

那么,'right' 是哪条路呢?如果是第一个,我该如何设计函数以便它们可以提取正确的值?

尝试使用一种途径,通过尝试将参数解析为数字,您可以检查它是 isbn 还是类型。

如果为 NaN,则类型为 bn

你可以这样做:

// /api/

router.get('/isbn/:isbn', function (req, res) 
{
  var isbn = req.params.isbn
})

// /api/books/query

router.get('/genre/:genre', function (req, res) 
{
  var genre = req.params.genre
})

这会起作用,而且这是最常用的格式。

如果您不想只有一个 uri,那么请这样做 :

// /api/books/isbn

router.get('/', function (req, res) 
{
    var isbn = req.query.isbn
    var genre = req.query.genre
    if (isbn)
        res.redirect('/isbn/' + isbn);
    else if (genre)
        res.redirect('/genre/' + genre);
})

我觉得你尝试的第二种方法应该也可以。

但是,如果你让我这样做。我将创建以下 api:

  1. /api/books/genre/Adventure
  2. /api/books/isbn/1231230912

这有助于明确区分 API,并使它们在未来可维护和可读。

为了节省编写 2 个路由处理程序的时间,您可以只编写一个路由处理程序函数并将 genre 或 isbn 作为参数传递。