繁体   English   中英

Node JSON.stringify中的额外引号

[英]Extra quote marks in Node JSON.stringify

我有一个创建和导出配置对象的模块。 在浏览器环境中运行时,其字符串值必须为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,用于构建库

此解决方法仅检查开头和结尾处的重复引号。 它可以在两种环境下工作。

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') };

根据定义, JSON.stringify()通过添加额外的引号将字符串转换为字符串。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM