如何从Node http(s)请求中获取数据?

时间:2018-04-06 04:49:30

标签: node.js

如何从其范围之外的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

2 个答案:

答案 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
        };
    });
  });