2016-11-13 88 views
0

我正在使用節點包請求發送請求到我的後端。問題是,Request/GET和/ POST返回不同的實體。節點請求返回不同的結果

res.json()來自一個擁抱的express函數,所以不要混淆。

/GET返回JSON

request({ 
    url: baseUrl + '/users', 
    method: 'GET' 
}, function (error, response, body) { 
    if (error) { 
     res.send('500', 'Internal Server Error'); 
    } else { 
     console.log(body); 
     res.json(response.statusCode, body); 
    } 
}); 

的console.log(主體):

[{ 
    "id": "1", 
    "forename": "John", 
    "surename": "Doe", 
    "birthdate": 1478953818343, 
    "email": "[email protected]" 
}, { 
    "id": "2", 
    "forename": "John", 
    "surename": "Doe", 
    "birthdate": 1478953818343, 
    "email": "[email protected]" 
}] 

/POST返回JavaScript對象

request({ 
     url: baseUrl + '/users', 
     method: 'POST', 
     json: { 
       email: req.body.email, 
       forename: req.body.forename, 
       surename: req.body.surename 
     } 
}, function(error, response, body) { 
     if (error) { 
       res.send('500', 'Internal Server Error'); 
     } else { 
       console.log(body); 
       res.json(response.statusCode, body); 
     } 
}); 

的console.log(主體):

{ id: '3', 
    forename: 'John', 
    surename: 'Doe', 
    birthdate: 1478953818343, 
    email: '[email protected]' } 

當我設置請求選項json:false時,兩者都返回一個json。 當我設置請求選項json:true時,都返回javascript對象。

後端響應在兩個請求上都是json。我不知道這種行爲是一個錯誤還是我做錯了什麼。

請求文檔說: json - 將body設置爲值的JSON表示並添加Content-type:application/json頭。此外,將響應正文解析爲JSON。

body - body body用於PATCH,POST和PUT請求。必須是一個Buffer,String或ReadStream。如果json爲true,則body必須是JSON序列化的對象。

那麼,爲什麼/ GET返回JSON和/ POST返回javacript對象,當它在兩個方法上接收json響應?

+0

你能張貼在這裏,對於'GET'和'POST'方法的反應,看看他們有什麼不同? –

+0

'當我設置請求選項json:true時,都返回javascript對象。是不是json選項的重點,..它基本上會自動爲您的結果做一個JSON.parse。這是一個JavaScript對象,因爲JSON只是一個字符串。 – Keith

回答

0

GET請求返回json字符串,因爲您尚未將json選項設置爲true。

在您的POST請求中,您希望發送一個正文,但是,這不是通過將對象傳遞給json來完成的。 json選項只是表示你的body應該被解碼成json。 這就是爲什麼文檔說:

如果json爲true,那麼body必須是JSON序列化的對象。

所以json僅僅是一個布爾值和body包含實際數據。

做身體POST請求的正確方法:

request({ 
    url: baseUrl + '/users', 
    method: 'POST', 
    json: true, // "sets body to JSON representation of value and adds Content-type: application/json header." 
    body: { 
      email: req.body.email, 
      forename: req.body.forename, 
      surename: req.body.surename 
    } 
}, function(error, response, body) { 
    if (error) { 
      res.send('500', 'Internal Server Error'); 
    } else { 
      res.json(response.statusCode, body); 
    } 
}); 
+0

用console.log(body)輸出編輯我的問題。 – mnlfischer

+0

那麼,你的後端只是爲每個請求方法提供不同的響應。所以也許你可以包含你的服務器端代碼。 – schroffl

+0

我沒有開發後端,只有bff。這是我的第二個想法,但是當我嘗試郵遞員發出相同的請求時,它會在兩者上返回有效的json。 – mnlfischer