Подтвердить что ты не робот

Node.js JSON.stringify() вызывает " в выводе. Невозможно разобрать с JQuery

Я использую Node.js(с Express.js) для передачи объекта данных JSON с сервера на клиентский вид.

Когда я передаю объект JSON непосредственно в представление, я получаю объект JSON, показанный на странице, как и ожидалось (это WORKS):

pageprovider.findAllTag( function(error, pages){
    res.send(pages);
})

И мой вывод выглядит так (намного больше, много вложенных объектов)

{"green":{"title":"green","pagesContaining": ""}}

Когда я пытаюсь передать его в свой Jade View следующим образом:

pageprovider.findAllTag( function(error, tagsJSONObj){
        //res.send(pages);

    pageprovider.findAll( function(error, pages){
        res.render('search_tags.jade', { locals: {
            title: 'Search by Tags',
            'pages': pages,
            tagsJSON: JSON.stringify(tagsJSONObj) //pass the tags data as a JSON obj
            }
        });
    }) //pageprovider.findAll
}) //pageprovider.findAllTag

Проблема
Когда я передаю 'tagsJSON' в представление, вывод включает в себя html-объекты:

var obj = jQuery.parseJSON( "{"name": 'value'}");

JQuery выдает ошибку, потому что ей не нравится """. Как я могу получить Node, чтобы дать мне правильную цитату, или получить jQuery для принятия этого формата?

Любые мысли?

4b9b3361

Ответ 1

Это потому, что когда вы вызываете

    res.render('search_tags.jade', { locals: {
        title: 'Search by Tags',
        'pages': pages,
        tagsJSON: JSON.stringify(tagsJSONObj) //pass the tags data as a JSON obj
        }
    });

search_tags.jade предназначен для вывода HTML, поэтому он кодирует ваши кавычки. Вы должны использовать средство визуализации, которое не вытесняет HTML, или, по крайней мере, изменить ваше представление, чтобы ваши параметры не были закодированы в HTML

Если вы не хотите, чтобы что-то в выведенном выходе не использовалось, используйте !{tagsJSON} в представлении. Однако при выдаче JSON нет необходимости в представлении. вы можете просто взять свой объект, вызовите JSON.stringify. Я не использую JADE, поэтому я не уверен, есть ли способ создать представление, которое может просто вызвать JSON.stringify(), но это то, что я сделал в JSP, скорости, ASP, PHP и Code Igniter (не используя JSON.stringify, вместо этого он использует инструмент JSON для данного языка)

Ответ 2

в ejs, его <%- tagsJSON %>

          ^ <---- Note the "-"

Ответ 3

Лучшее решение при использовании Swig.js

{{ data|json|raw }}

Ответ 4

Swig Templating Двигатель:

Поскольку Swig не упоминается, я добавлю свою версию.

Сегодня я столкнулся с этой проблемой и провел несколько часов, пытаясь заставить ее работать, чтобы я мог отправлять данные в Chart.js: http://www.chartjs.org/docs/

В моем случае я использовал Geddy.js вместо Express.js. Как и исходный плакат, я также получил проблему с строкой JSON с html-экранами.

Я использую механизм шаблонов Swig.

Спасибо Хуан Мендес за упоминание html escaping, я нашел это обсуждение разработчиком Swig:

https://github.com/jnordberg/wintersmith-swig/pull/1

Это привело меня к поиску возможности отключения автоматического экранирования.

Сначала я попробовал:

{{ data|raw }} // didn't work

как было упомянуто на странице github, но это не сработало, поэтому я пошел в документацию и нашел это:

http://paularmstrong.github.io/swig/docs/tags/

Золото!: D

Итак окончательное решение:

{% autoescape false %}
var data = {{ data }}
{% endautoescape %}