如何在 JavaScript 字符串中创建换行符以提供给 NodeJS 以写入文本文件?

Posted

技术标签:

【中文标题】如何在 JavaScript 字符串中创建换行符以提供给 NodeJS 以写入文本文件?【英文标题】:How do I create a line break in a JavaScript string to feed to NodeJS to write to a text file? 【发布时间】:2012-12-19 20:04:33 【问题描述】:

我创建了一个简单的 html 页面,它从用户那里获取一些输入以存储在服务器上以便稍后检索——这就是当用户单击提交按钮时处理文本的方式(我放置了编号的 cmets在关键行下,但提供上下文的周围代码):

var origText = $('#input-field').val(),
        // 1. GETS WHATEVER USER TYPED INTO INPUT FIELD
    jsonText = ' "text": "' + origText + '" ',
        // 2. WRAPS IT AN OBJECT STRING
    ajaxText = encodeURIComponent(jsonText);
        // 3. ENCODES THE STRING FOR USE WITH AJAX

$.ajax(
    url: 'http://localhost:8124/',
    data: 'save=' + ajaxText + '&fn=save',
        // 4. THE ENCODED STRING IS ADDED TO THE QUERY SECTION OF THE AJAX REQUEST
    dataType: "jsonp",
    cache: false,
    timeout: 5000,
    success: function(data) 
        $("#input-ready").html(data.save.text);
    ,
    error: function(jqXHR, textStatus, errorThrown) 
        alert('error ' + textStatus + " " + errorThrown);
    
);

请求被发送到我在本地运行的 NodeJS 服务器,它(在http.createServer 回调中)执行以下操作:

var queryObj = url.parse(req.url, true).query;
    // 1. GET THE QUERY PART OF THE REQUEST/URL AS AN OBJECT
res.writeHead(200, 'Content-Type': 'application/javascript');
    // 2. PREPARE SERVER'S RESPONSE AS JAVASCRIPT
queryObj.fn = queryObj.fn || '';
queryObj.save = queryObj.save || '';
queryObj.callback = queryObj.callback || '';
    // 3. ENSURE THE PROPERTIES NEEDED ARE DEFINED, EVEN IF FALSE-Y
if (queryObj.fn === 'save') 
    // 4. IF THE REQUEST IS TO SAVE THEN WRITE THE USER INPUT AS OBJECT TO A TEXT FILE
    fs.writeFile('jsonp-storage-2.txt', queryObj.save, function (err) 
        if (err) 
            throw err;
         else 
            console.log('Saved message successfully.', 'Ready to be read now.');
            res.end(queryObj.callback +
                '( fn: "' + queryObj.fn + '", save: ' + queryObj.save + ' )');
        
    );

假设用户键入并提交“这是一行文本”,服务器上的输出是一个名为 jsonp-storage-2.txt 的文本文件,其中包含:

 "text": "this is a line of text" 

毕竟,我的问题很简单。如何美化文本文件中的输出?

代码需要工作,但我正在考虑使用它来尝试存储更大的对象以供以后阅读。但是,在服务器端,我希望文件(现在)在使用记事本打开文件时易于阅读。

我尝试过像这样使用\n\t

jsonText = '\n\t"text": "' + origText + '"\n',

我也试过\r。但线条仍然没有中断。

一些答案​​表明我只能这样做at the level of the encoded string 或after the file has been written。也许我错过了一些简单的事情。有没有办法通过操纵我的jsonText 变量来做到这一点?

更新:

只是为了更清楚地了解所需的输出 -- 目前生成的文本文件的内容如下所示:

 "text": "this is a line of text" 

但我想知道它是否可以这样制作:


    "text": "this is a line of text"

【问题讨论】:

美化存储它们真的很重要吗?为什么不只是在你真正打开它们时美化它们? 由于白线是您的存储概念的一部分,而不是消息的一部分,为什么不将它们附加到您的 nodeJS 代码中呢? fs.writeFile('jsonp-storage-2.txt', queryObj.save + "\n\n", function (err) @DaveNewton 感谢您的评论。我还不确定我要生成多少这样的文件。我意识到在这么小的规模上进行自动化似乎似乎太微不足道了,但我很好奇它是否可以完成,因为我不想打开每个文件并手动美化每个文件。即使打开文件时只需单击一下,如果有一百个或更多,就会变得乏味。 @guypursey 这就是他们发明脚本的原因;不知道为什么有人会手动做。但是你为什么要打开所有这些文件呢?除此之外:是否有可能在 Node 端解析 JSON 并将其存储为 JSON,这样的空格在其中没有意义? 谢谢@Roonaan。这可能有效,但是为了正确美化输出,换行符和缩进需要落在字符串本身内(而不是追加)。我已经编辑了我的问题以使其更清楚。 【参考方案1】:

事实证明,当使用 Node.js [编辑:in Windows] 将字符串写入(文本)文件时,使用\r\n 换行。

与encoded line breaks 一样,回车和换行都是必需的。所以代码行需要这样,而不是只有\r\n

jsonText = '\r\n\t"text": "' + origText + '"\r\n',

结果文件的内容现在可以根据需要显示:


    "text": "this is a line of text"

【讨论】:

换行编码因平台而异。 \r\n 是 Windows 及相关平台的换行编码,\n 是 UNIX 相关平台的换行编码。有关历史转移,请参阅 en.wikipedia.org/wiki/Newline。 @Plynx 谢谢。我应该在不久前回复此评论,现在这样做是为了鼓励人们使用我标记为正确的与平台相关的答案。我在这里的回答是我刚开始时使用 Node.js for Windows 的结果(所以它对我有用,因此它被留在这里)但并不适合所有用途。【参考方案2】:

使用

var os = require('os');
var jsonText = '' + os.EOL + '\t"text": "' + origText + '"' + os.EOL + '';

【讨论】:

这个答案一定是正确的。因为在某些情况下编写 windows 'return caret character' \r 可能会引发异常。对此要非常小心! 对不起,我才看到这个。这是一个比我更好的答案,所以我将其标记为正确。 你也可以使用JSON.stringify(data, null, " ")

以上是关于如何在 JavaScript 字符串中创建换行符以提供给 NodeJS 以写入文本文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中创建带换行符的字符串? [复制]

如何在 Javascript 中创建查询参数?

如何在Javascript中创建动态文件+链接以供下载? [复制]

如何在Javascript中创建随机字符串? [复制]

如何在 JavaScript 文字符号中创建关联数组

如何在 C#.Net 中创建原型方法(如 JavaScript)?