【问题标题】:Transform file full-content nodejs转换文件全文nodejs
【发布时间】:2015-02-11 18:16:19
【问题描述】:

我正在使用 NodeJS 构建一个网站,该网站要求上传数据文件,然后我必须检查并(如果需要)转换该文件的内容。

源文件是 JSON 或 XML 配置文件,我只需要确保其内容格式正确,适用于应用程序的其余部分。

我想知道检查全局文件内容的最佳方法是什么。

我通常使用 Streams 来操作文件,但我不确定它是否允许我做我想做的事...

源文件格式类似:

{
    "parameters": [{
        "name": "name",
        "settings": {
            "key": "value"
        }
    }],
    "data": [{
        "id": "1",
        "label": "label 1",
    }, {
        "id": "2",
        "label": "label 2"
    }]
}

我需要做的是解析文件的内容,并检查文件格式是否正确; 否则将文件转换为格式良好的文件:

// Read the file content

var parameters = [],
    data = [],
    p = parameters.length,
    d = data.length;

// Loop on the parameters, and check the format
while (p--) {
    var parameter = parameters[p];

    if (name in parameter && typeof parameter.name == "string") {
        // Add several rules

        parameters.push(parameter);
    }
}

// Do a similar control for "data".

// Then save the well-formatted parameters and data into a file

问题是上传的文件可能非常大... 我可以使用 transform Streams 执行它吗?因为我需要将文件的全部内容作为对象检查! 例如,我如何确定 Stream 转换器不会提供仅包含部分数据的块?

【问题讨论】:

    标签: json node.js parsing stream filesystems


    【解决方案1】:

    我会先尝试这样的事情:

    var fs = require('fs');
    
    try {
        var inputFile = require('./config.json');
    } catch (e) {
        console.log(e.message);  // Do proper error handling.
    }
    
    // Loop on the parameters, and check the format
    if (!'parameters' in inputFile) {
        console.log("Got a problem here!");
    }
    
    var parameters = [];
    var p = inputFile['parameters'].length;
    
    while(p--) {
        var parameter = inputFile['parameters'][p];
    
        if ('name' in parameter && typeof parameter.name == 'string') {
            // Add several rules
            parameters.push(parameter);
        }
    }
    
    // Do a similar control for "data".
    var data = inputFile['data'];
    // More code needed here...
    
    // Then save the well-formatted parameters and data into a file
    fs.writeFileSync('./data.json', JSON.stringify({parameters: parameters, data: data}, null, 4) , 'utf-8');
    

    如果您正在处理无法放入内存的庞大文件,那么您将面临一项艰巨无比的任务。一般来说,你不能保证部分读取会给你足够的 JSON 来解析任何内容(例如{"data": ["<FOUR PETABYTE STRING>"]})。

    【讨论】:

    • 文件读取而不是流式传输...我担心这是一个限制,但我会通知用户,我认为没有人有 。否则我无论如何也帮不了他:)
    • 顺便说一句,使用“require”而不是 NodeJS 文件系统有什么好处?
    • .json 文件上的 require 将文件读取和 JSON 解析组合成一个命令。请记住,它会缓存结果,因此在更改该文件时需要重新启动服务器。
    • 没想好,谢谢你的帮助!
    猜你喜欢
    • 2017-07-12
    • 2016-11-27
    • 2016-02-20
    • 2020-11-09
    • 2019-03-31
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-13
    相关资源
    最近更新 更多