Node JSON.stringify

时间:2017-04-24 21:57:56

标签: javascript json node.js string isomorphic-javascript

我有一个创建和导出配置对象的模块。在浏览器环境中运行时,其字符串值必须为JSON.stringified。否则,它们将被解释为裸标识符。

在节点中,JSON.stringify似乎添加了一组无关的双引号。

什么解决方案适用于浏览器和节点?

我检出的大多数节点模块,搜索JSON.stringify处理复杂对象的字符串表示/翻译。

在浏览器+ webpack 2.2.4中运行,在节点中失败:

module.exports = {
    url: JSON.stringify(process.env.SOME_URL),
    // in node, resolves to '"https://..."'
    headers: {
        Authorization: JSON.stringify(basicAuthString),
        // in node, resolves to '"Basic ...="'
        'Content-Type': JSON.stringify('application/json'),
    }
};

在节点中工作,在浏览器+ webpack 2.2.4中失败:

module.exports = {
    url: process.env.SOME_URL,
    // in node, resolves to bare https://...
    // Uncaught SyntaxError: Unexpected token :
    headers: {
        Authorization: basicAuthString,
        // in browser, resolves to bare Basic ...=
        // actions.js:15 Uncaught SyntaxError: Unexpected identifier
        'Content-Type': JSON.stringify('application/json'),
    }
};

对于webpack,process.env值是在构建时使用以下方法捕获的:https://github.com/AngularClass/angular2-webpack-starter/wiki/How-to-pass-environment-variables

更新:解决方法和剩余问题

  1. 问题的根本原因是什么?
    • 图书馆代码
    • 构建库用户项目的webpack 2x
    • Babel 6.24.1,用于构建库
  2. 此解决方法只检查开头和结尾的重复引号。它适用于两种环境。

    const str = (s) => {
        let ret = JSON.stringify(s);
        if (ret.indexOf('""') === 0) {
          ret = ret.slice(1);
        }
        if (ret[ret.length - 2] === '"') {
          ret = ret.slice(0, -1 + ret.length);
        }
        return ret;
    };
    
    module.exports = { foo: str('bar') };
    

1 个答案:

答案 0 :(得分:0)

By definition JSON.stringify()通过添加额外的引号将字符串转换为字符串。

  

如果Type(value)是String,则返回使用参数值调用抽象操作Quote的结果。

而不是JSON.stringify()你不能只使用String()吗? Node不会更改字符串,webpack也应该正确处理它。