如何将 NodeJS 表单数据对象转换为 JSON 字符串

How to convert NodeJS form-data object into JSON string

我在我的 NodeJS 应用程序中使用 form-data 包来发送表单数据。我正在使用 Axios 拦截器将请求记录在文件中。在 axiosIns.config.data 中,我需要与表单数据集对应的 JSON 字符串,但目前它是 FormData 对象。

这个库提供了一个 toString 方法,但是在使用它时我发现它 returns 是一个静态字符串 [object FormData] 而不是字符串化的输入。我已经打开了 an issue,但似乎无人看管。

我创建了 a repl 用于重新生成它。

有什么方法可以将我的 formdata 对象转换为可读、可记录、最好是 JSO 字符串?

我解决了

const FormData =  require("form-data");

var data = new FormData();
data.append("modid", "IM");
data.append("token", "provider\nagg");
data.append("cat_type", "3");

var boundary = data.getBoundary();

var data_row = data.getBuffer().toString();

console.log(rawFormDataToJSON(data_row,boundary));

function rawFormDataToJSON(raw_data,boundary){
    var spl = data_row.split(boundary);
    var data_out = [];
    spl.forEach(element => {
        let obj = {};
        let ll = element.split("\n");
         if(ll[1]){
            let key = ll[1].split("=")[1].replace('"',"").replace('"\r',"");
            let val = "";
            if(ll.length > 3){
                for (let i = 3; i < ll.length; i++) {
                    val += ll[i]+"\n";
                }
            }
            obj[key] = val.replace("--","").replace("\r\n\n","");
            data_out.push(obj);
         }
    });
    return data_out;
}

预期输出

[ { modid: 'IM' }, { token: 'provider\nagg' }, { cat_type: '3' } ]

编辑: 我提到了 reply on the github issue 并且根据 “这个包不打算以某种方式实现 toString()到 return 字符串化数据。如果我想要符合规范的 FormData,我需要安装提到的其他包。所以这不是问题,而是一个有意未实现的功能。"


我试过下面的代码,看起来不错但不推荐,因为它基于文本拆分和过滤,如果文本格式发生变化,可能会产生问题。这是相同的 the sandbox

const FormData = require("form-data");

var data = new FormData();
data.append("modid", "IM");
data.append("token", "provider");
data.append("cat_type", "3");

const objectifyFormdata = (data) => {
    return data
        .getBuffer()
        .toString()
        .split(data.getBoundary())
        .filter((e) => e.includes("form-data"))
        .map((e) =>
            e
                .replace(/[\-]+$/g, "")
                .replace(/^[\-]+/g, "")
                .match(/\; name\=\"([^\"]+)\"(.*)/s)
                .filter((v, i) => i == 1 || i == 2)
                .map((e) => e.trim())
        )
        .reduce((acc, cur) => {
            acc[cur[0]] = cur[1];
            return acc;
        }, {});
};

console.log(objectifyFormdata(data));
// { modid: 'IM', token: 'provider', cat_type: '3' }