2015-06-15 3 views
2

Я пытаюсь определить, могу ли я вызвать res.send (data), а затем res.render ('reports') одновременно.res.send и res.render calls

Чтобы подробнее объяснить, когда я направляюсь к '/ reports', сначала на моей стороне сервера я делаю вызов REST API, который возвращает обратно данные json. Теперь я хочу, чтобы эти данные json были доступны на клиенте, для чего я делаю ajax-вызов из своего javascript. Таким образом, использование 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 заголовок, чтобы сказать ваш экспресс-сервер, чтобы вернуть JSON вместо HTML:

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.

Вы можете написать свое представление для вывода HTML-документа с помощью элемента <script>, содержащего ваш JSON, в виде литерала JavaScript.

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); 
}); 
Смежные вопросы