如下所示,在我的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');
});
}
答案 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方法中。真的很高兴它是如何成功的!