armazenar o objeto nodejs dentro da tag do script pug

Sep 13 2020

Tenho alguns objetos que preciso renderizar / armazenar em meu arquivo pug para uso posterior em scripts JS do lado do cliente.

Para armazenar objetos dentro de uma tag de script, eu usaria o método descrito aqui e aqui :

Variável NodeJS

const object = {
    "someKey": {
        "message":"this works"
    }
}
res.render("index", {object});

pug (em algum lugar do arquivo - observe o. após a tag do script)

observe também que estou usando aspas duplas - você pode usar aspas simples, mas mencionarei isso para mais tarde

script.
    var object = JSON.parse("!{JSON.stringify(object)}")

então em algum lugar em seus scripts javascript

alert(object.someKey.message)

Leia mais sobre Interpolação Pug aqui .

Problema:

Para todos os meus usos, o exemplo acima funciona bem. O problema surge quando tenho um objeto com aspas simples:

const object = {
    "someKey": {
        "message":"this doesn't work"
    }
}

Javascript não gosta do fato de haver uma aspa simples, pois a vê como o início / fim de uma chave / valor de objeto:

obter isso do console do Chrome

Causa:

A remoção dessa aspa simples resolve o problema. Ao atingir esse ponto, a JSON.parse()função lança a exceção e para de carregar todo e qualquer JS, portanto, nenhuma função adicional funciona. Uma solução alternativa é colocar isso no final da página, mas isso não resolve o problema.

Pergunta:

Como posso passar um objeto de NodeJS para pug (como mostrado acima) com aspas simples?


Atualizar

MCVE do problema usando a placa padrão NodeJS Expresss

https://github.com/cybex-dev/pug-single-quote-isse

Instruções de configuração:

git clone https://github.com/cybex-dev/pug-single-quote-isse
npm install 
npm start

Você deve esperar para ver alguma saída do console, eu simplesmente vejo:

e "linha de erro"

Respostas

1 kmgt Sep 13 2020 at 16:06

Não consigo reproduzir seu exemplo de trabalho com:

script.
    var object = JSON.parse("!{JSON.stringify(object)}")

Mas o que funciona para mim é o seguinte:

script.
    var object = !{JSON.stringify(object)};
    console.log(object.someKey.message);

Sem aspas duplas: var object = !{JSON.stringify(object)}