如何将 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' }
我在我的 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' }