在Express上的/ POST请求中的Axios请求

时间:2017-07-04 18:24:26

标签: node.js express routes axios

如下所示,在我的server.js文件中,我有一个/ POST信息请求,在表单提交时被调用。

我开始对阅读app.post和express路线之间的差异感到困惑,如果无论如何使用路线会使我的代码受益。

在/ POST信息中,我对2个不同的API有两个axios请求,我认为将代码移到别处以使其更清晰是明智的。

知道路线如何在这里工作对我有益吗?如果你能解释这里的差异那将是很棒的。

app.post('/Info', function (req, res) {
   var State = req.body.State;
   var income = Number(req.body.income);
   var zip = req.body.ZIP;
   axios.post('https://taxee.io/api/v2/calculate/2017', {
      //data sent to Taxee.io
      "exemptions": 1
      , "filing_status": "single"
      , "pay_periods": 1
      , "pay_rate": income || 100000
      , "state": State || "NY"
   }, {
         headers: {
            'Authorization': "Bearer <API_KEY>"
            //headers
         }
   }).then(function (response) {
      var obj = {
        income: '$' + income
        , fica: response.data.annual.fica.amount
        , federal: response.data.annual.federal.amount
        , residence: State + ", " + zip
        , state: response.data.annual.state.amount
      }
      axios.get("https://www.quandl.com/api/v3/datasets/ZILL/Z" + zip + "_RMP.json?api_key=<API_KEY>").then(function (response) {
         var monthRent = response.data.dataset.data[0][1]
         obj.rent = monthRent
         obj.yearlyRent = Number(monthRent) * 12;
      }).then(function (response) {
         res.send(obj);
      });
  }).catch(function (error) {
      alert('error');
  });
}

2 个答案:

答案 0 :(得分:1)

在Express应用程序中定义路由有两种方法:

直接使用Express应用程序(app)对象:

const express = require('express')
const app = express()

app.post(...)
app.get(...)
app.put(...)
// and so on

或使用router对象:

const express = require('express')
const app = express()
const router = express.Router()

router.post(...)
router.get(...)
router.put(...)
// and so on

app.use(router)

我的猜测是,您一直在阅读带有router对象的后一段代码。使用Express&#39; Router对象确实可以使代码更清晰,因为更多的关注点分离。

从您自己的API调用外部API没有任何问题。例如,在我的项目中,我在this行上调用了Google Calendar API。我的唯一区别是我在使用标准HTTP请求时使用了Google APIs Node.js Client。我当然可以使用here所示的HTTP请求。

您的代码很好,但可以改进。例如,而不是:

axios.post('...', {
  exemptions: 1,
  filing_status: 'single',
  pay_periods: 1,
  pay_rate: income || 100000,
  state: State || 'NY'
})

您可以调用辅助函数来准备选项对象:

function prepareOptions (state = 'NY', income = 100000) {
  return {
    exemptions: 1,
    filing_status: 'single',
    pay_periods: 1,
    pay_rate: income,
    state: State
  }
}

然后这样称呼它:

axios.post('...', prepareOptions(State, income))

这使代码更具可读性。

最后,没有理由在服务器端使用axios。只需使用HTTP module内置的Node。

答案 1 :(得分:1)

    app.post('/Info', function (req, res) {

        var uData ={
             state: req.body.State,
            income : Number(req.body.income),
            zip: req.body.ZIP
        };

        taxee(uData).then(function(data){

          return rent(data)  ;
        }).then(function(fullData){

            res.send(fullData);
        }).catch(function (error) {
        res.render('error');
    });
function taxee(data) {
    return new Promise((resolve, reject) => {

        var income = data.income;
        var state = data.state;
        var zip = data.zip;
        axios.post('https://taxee.io/api/v2/calculate/2017', {
            //data sent to Taxee.io
            "exemptions": 1
            , "filing_status": "single"
            , "pay_periods": 1
            , "pay_rate": income || 100000
            , "state": state || "NY"
        , }, header).then(function (response) {
            var taxData = {
                income: '$' + income
                , fica: response.data.annual.fica.amount
                , federal: response.data.annual.federal.amount
                , stateTax: response.data.annual.state.amount
                , state
                , zip: zip
            }
            resolve(taxData);
        }).catch(function (error) {
            console.log('break');
            resolve(error);
        });
    });
};

function rent(data) {
    return new Promise((resolve, reject) => {
        axios.get("https://www.quandl.com/api/v3/datasets/ZILL/Z" + data.zip + "_RMP.json?api_key=d7xQahcKCtWUC4CM1LVd").then(function (response) {
            console.log(response.status, ' status');
            var monthRent = response.data.dataset.data[0][1];
            data.rent = monthRent
            data.yearlyRent = Number(monthRent) * 12;
            return data;
        }).then(function (response) {
            resolve( data);
        }).catch(function (error) {
            reject(error);
        });
    });
}
module.exports = {
    taxee
    , rent
};    

将上面的代码放到干净的promise方法中。真的很高兴它是如何成功的!