我正在尝试从我的angularjs控制器向nodejs服务器发送POST请求,然后该服务器应该向外部API发送完整的POST请求,这样可以避免CORS请求,并使其更加安全,因为我在在此POST请求中发送相对私有的数据。
我的angularjs控制器函数用于向nodejs服务器发出post请求,看起来像这样,它工作正常:
var noteData = {
"id":accountNumber,
"notes":[
{
"lId":707414,
"oId":1369944,
"nId":4154191,
"price":23.84
}
]
}
var req = {
method: 'POST',
url: '/note',
data: noteData
}
$http(req).then(function(data){
console.log(data);
});
现在问题在于我的nodejs服务器,我似乎无法弄清楚如何正确发送带有自定义标头的POST请求并传递JSON数据变量..
我使用nodejs https功能,因为我需要访问的网址是https而不是http,我也尝试了请求功能而没有运气。
我知道我发送的网址和数据是正确的,因为当我将它们插入Postman时,它会返回我希望它返回的内容。 以下是我对nodejs服务器的不同尝试:
使用body-parser
正确解析和检索angularjs请求中的数据尝试使用请求:
app.post('/buyNote', function (req, res) {
var options = {
url: 'https://api.lendingclub.com/api/investor/v1/accounts/' + accountNumber + '/trades/buy/',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': apiKey
},
data = JSON.stringify(req.body);
};
request(options, function (error, response, body) {
if (!error) {
// Print out the response body
// console.log(body)
console.log(response.statusCode);
res.sendStatus(200);
} else {
console.log(error);
}
})
由于某种原因,它返回状态代码500,它错误地发送数据,因此导致服务器错误......
使用https
var options = {
url: 'https://api.lendingclub.com/api/investor/v1/accounts/' + accountNumber + '/trades/buy/',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': apiKey
}
};
var data = JSON.stringify(req.body);
var req = https.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.log(`problem with request: ${e.message}`);
});
req.write(data);
req.end();
由于某些原因,Https尝试返回301状态......
在Postman中使用相同的数据,标题和网址会返回一个成功的响应200,其中包含我需要的数据......
我不明白我怎么能做一个简单的http请求......
请注意:这是我第一个使用nodejs和angular的项目,我知道如何在php或java中轻松实现这样的东西,但这让我感到难以置信..
答案 0 :(得分:4)
所以经过大量的讨论和尝试不同的事情后,我终于找到了性能良好的解决方案,并且完全符合我的要求而不会使事情变得复杂:
使用名为request-promise的模块就是诀窍。这是我用于它的代码:
const request = require('request-promise');
const options = {
method: 'POST',
uri: 'https://requestedAPIsource.com/api',
body: req.body,
json: true,
headers: {
'Content-Type': 'application/json',
'Authorization': 'bwejjr33333333333'
}
}
request(options).then(function (response){
res.status(200).json(response);
})
.catch(function (err) {
console.log(err);
})