2016-07-25 23 views
3

我試圖從客戶端Ajax調用發送到我的服務器與數據有關的輸入參數。當我嘗試這樣做時,我只能看到服務器控制檯中的數據,而不是瀏覽器中的數據。本地Ajax調用提供任何響應文本

在這裏,在客戶端是Ajax調用與「Peter_Abelard」設置爲演示稱號。這個電話給了我一個200好的狀態,但是響應文本是空的。

$.ajax({ 
    type: "GET", 
    url: 'http://localhost:3000/api/wiki/Peter_Abelard', 
    async: false, 
    datatype: 'json', 
    success: function(response){ 
     console.log(response); 
    } 
    }); 

在服務器端的代碼我有

function getData(name){ 
wikipedia.page.data(name, { content: true }, function(response) { 
    console.log(JSON.stringify(response)); 

    var dad = JSON.stringify(response); 

    fs.writeFile("wikip.txt", dad, function(err) { 
    if (err) throw err; 
    console.log('It\'s saved!'); 
    }); 

    return dad; 
}); 
} 

app.get('/api/wiki/:que', function(req, res) { 
    var queryd = req.params.que; 
    getData(queryd); 
    res.send(getData(queryd)); 
}); 

我相信這個問題有一些與線res.send(getData(queryd)),但我不知道要嘗試什麼。如果我是正確的,這行應該發送正確的文本給客戶端。

+1

從'的getData(名稱)',而不是返回響應返回'dad'因爲在阿賈克斯你所要求的,「JSON」,但你不發送一個 –

+0

只是去嘗試和responseText的仍是空白。這可能是正確的道路上的一步。 – chackerian

+0

這裏有些事情是錯誤的。首先,你的getData()函數是異步的,所以它不可能返回結果。其次,你從實際的'getData()'函數中沒有返回任何東西。我建議你閱讀這個[如何從異步調用返回響應](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call )。 – jfriend00

回答

2

有幾件事情錯了你目​​前的做法:

  1. 有一個從實際getData()函數沒有返回值。這就是爲什麼你總是得到undefined。你從內部回調中返回,但是這沒有任何作用。

  2. 你的結果是異步的,所以沒有辦法可以從getData()返回,因爲結果甚至不知道還當getData()回報。異步響應意味着你的Javascript繼續運行(這樣getData()回報空手)和異步回調晚些時候調用。

  3. 爲了使這項工作,getData()需要接受一個回調,它可以在數據可用時調用,或者需要返回一個承諾,然後調用者需要使用該回調或承諾適當地獲取數據。

要做到這一點,您必須知道如何處理node.js中的異步操作。我建議這樣做:

function getData(name, cb) { 
    wikipedia.page.data(name, {content: true}, function (response) { 
     console.log(response); 

     cb(null, response); 

     // I'm not sure why you're writing this here 
     fs.writeFile("wikip.txt", dad, function (err) { 
      if (err) throw err; 
      console.log('It\'s saved!'); 
     }); 
    }); 
} 

app.get('/api/wiki/:que', function (req, res) { 
    var queryd = req.params.que; 
    getData(queryd, function (err, data) { 
     if (err) { 
      // send error response here 
     } else { 
      res.json(data); 
     } 
    }); 
}); 

P.S.我覺得wikipedia.page.data()有一個異步回調響應,但沒有錯誤報告機制,這看起來很奇怪。

您可以通過閱讀這個答案詳細瞭解異步操作在Node.js的處理:How do I return a response from an asynchronous operation

+0

我寫了一個文件,因爲我想我可以使用該文件如果我不知道如何直接發送數據到客戶端。感謝您仍然幫助解決我的客戶服務器問題。什麼是cb btw?這使它同步或什麼? – chackerian

+0

'cb'只是getData方法中的一個回調。它運行你作爲getData方法的第二個參數傳遞的方法。 'app.get(queryd,function(err,data){...)}'。它肯定不會使它同步,但我希望@ jfriend00可以擴大這種方法如何解決回調的問題,我也很難理解這種方法。我已經看到它在多個地方使用:) – CapturedTree

+0

由於不會返回傳遞給此方法的第三個參數'dad''wikipedia.page.data(name,...,func(res){...} )''基本上在'wikipedia.page.data'這個方法中,第三個參數只有在data方法獲得實際響應之後纔會調用該函數,所以響應不應該是未定義的,因此'dad'不應該是不正確的? – CapturedTree