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

时间:2018-03-01 13:16:54

标签: javascript node.js uri

我正在使用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

那么,正确的方式是什么呢?办法?如果它是第一个,我如何设计这些功能以便他们能够提取正确的值?

3 个答案:

答案 0 :(得分:2)

我认为您尝试的第二种方法也应该没问题。

但是,如果你让我这样做的话。我将在apis下创建:

  1. / api / books / genre / Adventure
  2. / API /书籍/ ISBN / 1231230912
  3. 这有助于明确区分apis并使其在未来可维护和可读。

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

答案 1 :(得分:1)

尝试使用一条路线,并尝试将参数解析为一个数字,您可以检查它是否为isbn或流派。

如果NaN那么其他类型isbn

答案 2 :(得分:1)

你可以这样做:

// /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);
})