如何从其范围之外的https请求获取数据?
我见过Where is body in a nodejs http.get response?,但它没有回答这个问题。事实上,这个问题也没有得到准确回答。在接受的答案(由提问者发布)中,使用第三方库。由于库返回的对象与http.get()
返回的对象不同,因此它不回答问题。
我尝试使用http.get()
将变量设置为await
的返回值,但返回http.clientRequest并且不允许我访问我需要的响应数据。
我正在使用带有Express的Node v8.9.4和https模块来向Google Custom Search请求数据。
我有两条路线。一个用于GET请求,另一个用于在首页提交表单时使用的POST请求。它们基本上都用于相同的目的...从CSE请求数据并将数据作为简单的JSON字符串呈现。我不想重复自己,而是将我的CSE请求代码放入一个函数中,只需在回调函数中调用该函数即可。
我从最里面的回调中想到了return
,但这不起作用,因为它不会到达请求的error
事件处理程序或必要的{{1}打电话。
这是实际代码的一个子集:
.end()
如果你很好奇,那就是freeCodeCamp项目:Image Search Abstraction Layer
答案 0 :(得分:1)
使用promise方法解决了这个问题。
cseSearch(req).then(searchResults=>{
res.end(searchResults)
}).catch(err=>{
res.status(500).end(searchResults)
})
function cseSearch (request) {
return new Promise((resolve, reject)=>{
...your http request code
cseResponse.on('end', () => {
let cseResult = JSON.parse(jsonString)
let items = cseResult.items
items.map(item => {
let resultItem = {
url: item.link,
snippet: item.title,
thumbnail: item.image.thumbnailLink,
context: item.image.contextLink
}
searchResults.push(resultItem)
})
resolve(searchResults);
})
})
}
答案 1 :(得分:1)
根据我在评论中解释的内容,为了让您了解代码使用request-promise
库的紧凑程度,以下是您可以使用的内容:
const rp = require('request-promise-native');
app.get('/api/imagesearch/:query', newQuery)
app.post('/', newQuery)
function newQuery (req, res) {
let query = req.body.query || req.params.query
console.log(`Search Query: ${query}`)
cseSearch(req).then(results => {
res.json(results);
}).catch(err => {
console.log("newQueryError ", err);
res.sendStatus(500);
});
}
function cseSearch (request) {
let cseParams = '' +
`?q=${request.params.query}` +
`&cx=${process.env.CSE_ID}` +
`&key=${process.env.API_KEY}` +
'&num=10' +
'&safe=high' +
'&searchType=image' +
`&start=${request.query.offset || 1}`
let options = {
hostname: 'www.googleapis.com',
path: '/customsearch/v1' + encodeURI(cseParams),
json: true
};
return rp(options).then(data => {
return data.items.map(item => {
return {
url: item.link,
snippet: item.title,
thumbnail: item.image.thumbnailLink,
context: item.image.contextLink
};
});
});