【问题标题】:Storing stylus in JSON / Document database将手写笔存储在 JSON / 文档数据库中
【发布时间】:2018-02-05 15:06:59
【问题描述】:

我想以 JSON 格式存储 Stylus,所以它看起来像:

{
  "file": "main",
  "content:" "body
                  font: 12px Helvetica, Arial, sans-serif;

              a.button
                  -webkit-border-radius: 5px;
                  -moz-border-radius: 5px;
                  border-radius: 5px;"
}

但我知道不使用 /n 就无法存储,有什么方法可以自动格式化制表符/标识,以便可以从文档数据库(即 MongoDB 或 ArangoDB)存储和检索它。

【问题讨论】:

  • 只需使用 \n 换行,使用 \t 换行 "body\n\tfont: 12px Helvetica, Arial, sans-serif;\n\na.button\n\t-webkit-border-radius: 5px;\n\t-moz-border-radius: 5px;\n\tborder-radius: 5px;"
  • @Molda 我听说过这种方法,说如果我有文件 main.stylus,我将如何以编程方式将其转换为所述格式以存储在数据库中,因为它不是很方便以这种格式编写手写笔。
  • 嗯,转义字符(\n、\t 等)是不可见的,但它们就在那里。为了向你证明这一点,你可以试试这个:用新的行和标签创建你的手写笔文件并保存它。然后用fs.readFile('filename.stylus', 'utf8', function(err, data) { 读取它并尝试用\t 拆分数据,你会得到一个数组。这意味着\t 存在但不可见。希望这是有道理的 :) 这也意味着如果您将文件内容保存到数据库,然后检索它并将其保存回文件,那么选项卡和新行仍将存在。
  • @Molda 感谢您的帮助,我已经弄清楚并发布了答案,我使用了您的方法并且效果很好! :)

标签: json node.js arangodb stylus


【解决方案1】:

另外一个例子,将文件内容存储为字符串属性值,不用RegExp之类的(不处理输入数据,已经是UTF-8字符串了):

const fs = require('fs');
const arangojs = require('arangojs');
const aql = arangojs.aql;

// Const variables for connecting to ArangoDB database
const host = '127.0.0.1'
const port = '8529'
const username = 'root' // default user
const password = '' // blank password by default
const database = '_system' // default database

 // Connection to ArangoDB
db = new arangojs.Database({
    url: `http://${host}:${port}`,
    databaseName: database
});
db.useBasicAuth(username, password); // authenticate

fs.readFile('assets/total.styl', 'utf-8', (error, content) => {
    if (error) {
        throw error;
    }
    db.query(aql`
        INSERT {
            name: "Total",
            type: "stylus",
            content: ${content}
        } INTO stylesheets
        RETURN NEW
    `).then(
        cursor => cursor.all()
    ).then(
        docs => docs.forEach(doc => console.log(doc)),
        err => console.error('Query failed:\n', err.response.body)
    );
});

结果文档(系统属性省略):

{
  "name": "Total",
  "type": "stylus",
  "content": "{\r\n  \"file\": \"main\",\r\n  \"content:\" \"body\r\n                  font: 12px Helvetica, Arial, sans-serif;\r\n\r\n              a.button\r\n                  -webkit-border-radius: 5px;\r\n                  -moz-border-radius: 5px;\r\n                  border-radius: 5px;\"\r\n}"
}

引用RFC:

2.5。字符串

字符串的表示是 类似于 C 中使用的约定 编程语言家族。一种 字符串以引号开头和结尾 分数。所有 Unicode 字符都可能是 放在引号内 除了必须的字符 转义:引号,反向 固相线和控制字符 (U+0000 到 U+001F)。

任何字符都可以被转义。

如果您的 .styl 文件包含此类字符...

00 01 02 03 04 05 06 07 08 09 10 5C 11 12 22 13

它们最终会在文档中正确编码:

{
  "name": "Total",
  "type": "stylus",
  "content": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\u0010\\\u0011\u0012\"\u0013"
}

【讨论】:

    【解决方案2】:

    好的,经过我对 ArangoDB 的广泛研究,您可以执行以下操作:

    var removeSpace = content.replace(new RegExp(/(?:\r\n|\r|\n)/g, 'g'), '\n')
    

    记住不需要转义\n, 对于其他数据库,这不是必需的,因为这些数据库会自动执行 JSON.stringify 传递的值。

    一个例子:(假设 DB 变量持有数据库连接)

    import IO from 'fs'
    IO.readFile('assets/total.styl', 'utf8', function(error, content) {
      if(error) {
        throw error
      }
      var contentUpdated = content.replace(new RegExp(/(?:\r\n|\r|\n)/g, 'g'), '\n')
      console.log(contentUpdated)
    
      cursor = DB.query('INSERT { name: "Total",  type: "stylus", content: "' + contentUpdated + '"} INTO stylesheets RETURN NEW').then(
        console.log(cursor)
      )
    
    })
    

    最后,如前所述,您不需要替换任何东西,ArangoDB 自动为我完成了。

    【讨论】:

    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2011-04-14
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多