2015-06-15 62 views
2

我正在嘗試確定是否可以同時調用res.send(data)和res.render('reports')。res.send和res.render調用

爲了進一步詳細解釋,當我路由到'/ reports'時,首先在我的服務器端對返回json數據的API進行REST調用。現在我想要在客戶端訪問這個json數據,爲此我正在從我的javascript中調用ajax。因此,使用res.send()的,但我也想呈現的頁面在此調用

因此,它看起來像我的服務器端代碼

router.get('/reports', function(req,res){ 
    //Making the REST Call to get the json data 
    //then 
    res.send(json); 
    res.render('reports'); 
}); 

每次我打了以下'/ reports',我看到json值而不是頁面被渲染,而我的控制檯會拋出一個錯誤:發送後無法設置標題。

+0

一旦你調用res.send,響應返回給客戶端並且連接關閉。 – mohamedrias

+0

什麼是最好的技術,以獲得該JSON值,因爲我必須呈現頁面,一旦我擊中路線 – Raj

回答

2

你可以使用content negotiation的是,當你的AJAX請求設置Accept頭來告訴你Express服務器返回而不是HTML JSON:

router.get('/reports', function(req,res) { 
    ... 
    if (req.accepts('json')) { 
    return res.send(theData); 
    } else { 
    return res.render('reports', ...); 
    }; 
}); 

或者,您可以檢查是否請求是用AJAX調用使用req.xhr(儘管這不是100%故障安全)。

0

不,你不能。您只能對給定請求進行單一響應。瀏覽器要麼是期望HTML文檔,要麼是期待JSON,但一次完成這兩個步驟都沒有意義。

render只是呈現一個視圖,然後調用send

您可以編寫您的視圖,以JavaScript文本的形式輸出含有您的JSON的<script>元素的HTML文檔。

3

不,你不能兩者都做,但你可以渲染頁面,並在同一時間發送數據:

res.render('reports',{data:json}); 

,然後在新生成的頁面訪問這些數據。

或者您可以在撥打電話時發送一個標誌,然後根據此標誌決定是要渲染還是發送。

+0

我確實想到了這一點,但我需要使用AJAX,因爲它使用插件是執行分頁爲了我。 – Raj

+0

然後使用該標誌。如果它是一個簡單的調用來呈現頁面,並且req.query上沒有任何內容,則渲染 頁面,否則您可以檢查req.query內部的內容,以及是否有由ajax調用發送的值使res.send – cs04iz1

+0

我不得不從服務器端渲染頁面,所以看起來像我不能使用res.send()。你能告訴我什麼是我的ajax訪問json數據的替代品嗎? – Raj

1

理想情況下,它需要2個獨立的路線,一個吐痰json和其他渲染視圖。否則,您可以傳遞一個url參數,具體取決於您返回json還是呈現視圖。

router.get('/reports/json', function(req,res){ 
    var data = JSON_OBJECT; 
    res.send(data); 
}); 

router.get('/reports', function(req,res){ 
    var data = JSON_OBJECT; 
    res.render('path-to-view-file', data); 
}); 
相關問題