2016-09-14 146 views
0

我正在構建一個應用程序,並且在從客戶端發出請求時發送問題,將其發送到我的服務器,讓服務器進行API調用,然後發送結果回到客戶端。我正在使用Node和Request-Promise模塊。異步Javascript請求問題(節點,請求承諾模塊)

這裏是客戶端代碼:

$(document).ready(function() { 
    var artistSearch =() => { 
     const q = $('.artistName').val(); 
     $.ajax({ 
      type: "POST", 
      url: "http://localhost:3000/request", 
      data: {artist: q}, 
     }) 
     .done(function(data) { 
      console.log('data: ', data) 
     }) 
    }; 

    $(".artistSearch").submit(() => { 
     artistSearch(); 
    }); 
}); 

這成功地向服務器的請求:

app.post('/request', (req, res) => { 
    const artist = req.body.artist; 
    const searchURL = "https://api.spotify.com/v1/search?  q="+artist+"&type=artist"; 
    var targetObj; 

    var options = { 
     uri: searchURL 
    }; 

    rp(options) 
     .then(function (data) { 
      console.log(data); 
      res.send(data); 
     }) 
     .then(function() { 
      console.log('complete'); 
     }) 
     .catch(function (err) { 
      console.log('error') 
     }); 

});

它最終成功地從API調用抓取數據,但從未將它發送回客戶端!如果我在我的承諾之外做res.send(),我可以在客戶端收到數據。

有什麼我失蹤?提前致謝!

+0

您不會得到_any_日誌? –

+2

這是一個錯字錯誤哈哈。您在代碼中發送字符串「data」而不是變量「data」。 –

+0

這是出於測試目的 - 即使仍然沒有數據通過。 –

回答

0

試試這個

var options = { 
    uri: searchURL, 
    simple: false, 
}; 

rp(options) 
    .then(function (data) { 
     console.log(data); 
     res.status(200).send(data).end(); 
    }) 
    .then(function() { 
     console.log('complete'); 
    }) 
    .catch(function (err) { 
     console.log('error') 
    }); 
0

我認爲客戶端沒有接收數據,但其認爲有更多的數據連接不正確終止。這是因爲你沒有指定頭文件,而模塊http找不到內容長度。

rp(options) 
    .then(function (data) { 
     console.log(data); 
     // res.send(data); 

     // assume data is JSON. 
     res.setHeader (200, {'Content-Type': 'application/json', 
          'Content-Length':data.byteLength}); 
     res.end(data); //Send data immediately. 
    }) 

...

如果數據是一個字符串,你需要使用data.length代替。實際上,如果數據是字符串,那麼在默認情況下,標題是{'Content-Type': 'application/json', 'Content-Length':data.length}