Express.js - 使用现有内部/本地端点构建新端点

时间:2017-02-21 06:58:07

标签: javascript json express

Express / JS的新手,请原谅我,如果这显然是不可能的。现在,我有一个端点,需要Google API返回政府官员名单并将其清理成可用的JSON。

app.get('/api/officials/:zip', (req, res) => {
  var request = require('request');
  request("https://www.googleapis.com/civicinfo/v2/representatives?key=" + process.env.GOOGLE_API_KEY + "&address=" + req.params.zip, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    // body returns a string so make it onto a JSON object
    cleanData = (tons of clean up statements);
    res.send(cleanData);
    }
  })
});

接下来,我有另一个端点,我想返回上面的结果,但是根据官方名称将其限制为特定条目。

app.get('/api/officials/:zip?name=:name', (req, res) => {
  var request = require('request');
  request('/api/officials/' + req.params.zip, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      official = _.find(body, {'name': req.query.name});
      res.send(official);
    }
  })
});

我已尝试过这几种方法,只在第二个端点上获得Error: Not Found

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

第二个API端点的网址错误。

GET /api/officials/:zip?name=:name

URL查询的处理方式与URL参数不同。当您使用:zip:name时,您说这个端点有两个req.params

但是,您要做的是将name作为URL查询而不是参数。

请改为尝试:

GET /api/officials/:zip

网址查询由express自动处理。

在您的情况下,您可以处理同一API端点中的两种情况。我将如何做到这一点:

app.get('/api/officials/:zip', function(req, res, next) {

  var request = require('request');

  request("https://www.googleapis.com/civicinfo/v2/representatives?key=" + process.env.GOOGLE_API_KEY + "&address=" + req.params.zip, function(error, response, body) {

    if (!error && response.statusCode == 200) {

      // body returns a string so make it onto a JSON object
      cleanData = "tons of clean up statements"; // do your processing

      if (req.query.name) { // checking if there is a 'name' variable in the req.query object 
        // handling your 2nd API endpoint

        official = _.find(cleanData, { 'name': req.query.name });

        res.send(official);
      } else { // if no 'name' variable is there in the req.query object just send the clean data
        // handling your 1st API endpoint

        res.send(cleanData);
      }
    }
  });
});