在 ExpressJS 中将对象传递给 JavaScript

pass object to javascript in ExpressJS

本文关键字:JavaScript 对象 ExpressJS      更新时间:2023-09-26

我在JSON.parse()中将包含双引号的json字符串转换回javascript对象时遇到问题。以下是详细信息。

  1. 我在 nodejs 应用程序中的变量groupdata中保存了一个对象.js

    [{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New'" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]

  2. 在我的 nodejs 应用程序中.js代码中,groupdata 对象作为 json 字符串传递给客户端。

    function doRender() { res.render('groupdata', { 'groupdata': JSON.stringify(groupdata) }); }

  3. 我的客户端代码首先尝试通过函数htmlDecode()防止 XSS 攻击,然后JSON.parse()有效的 json 字符串作为对象。

如果只有字符串不包含双引号,JSON.parse(test1)将成功。 JSON.parse(test2)将失败,如以下错误

     function htmlDecode(input){  //prevent XSS attack;
         var e = document.createElement('div');
         e.innerHTML = input;
         return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
     }
     console.log('groupdata: ' + "<%= groupdata %>");
     var test1 = htmlDecode("<%= (groupdata) %>");
     console.log('test1: ' + test1);
     var test2 = htmlDecode("<%= JSON.stringify(groupdata) %>");
     console.log('test2: ' + test2);
     JSON.parse(test1);  // Succeed if only test1 value contains no double quote
     JSON.parse(test2);  // ERROR: Uncaught SyntaxError: Unexpected token _

客户端 chrome 浏览器中的控制台登录:

groupdata: [{&#34;_id&#34;:&#34;56adb85319dec52455d11c21&#34;,&#34;fullName&#34;:&#34;NY Metro Office 365 What New&#34; group&#34;,&#34;createdAt&#34;:&#34;2015-08-25T17:03:59.000Z&#34;,&#34;stats&#34;:{&#34;members&#34;:65}}]
test1: [{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]
test2: "[{"_id":"56adb85319dec52455d11c21","fullName":"NY Metro Office 365 What New'" group","createdAt":"2015-08-25T17:03:59.000Z","stats":{"members":65}}]"

问题:在这种情况下,如何将带有双引号的 json 字符串转换为 javascript 对象?

事实证明,EJS有自己的方法来防止XSS攻击的htmlescape。

    <script type="text/javascript">
     var groupdata = <%- JSON.stringify(groupdata); %>
    </script>

这既简单又干净。再次感谢@migg的评论。