如何使用节点将表单数据(文本/纯文本)转换为 json?
Posted
技术标签:
【中文标题】如何使用节点将表单数据(文本/纯文本)转换为 json?【英文标题】:How to convert form data (text/plain) to json with node? 【发布时间】:2018-07-21 12:11:31 【问题描述】:我需要对 API 执行 POST 调用来下订单。因此,我制作了一个简单的 Node js 应用程序。目前,在这种当前状态下,我在我们的应用程序中接收到文本/纯文本数据,但这不是 JSON 样式的。
这就是我现在拥有的:
TypeOrder=buy
Coin=BTC
AmountCoin=1
CoinPriceInEuro=100
CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
PaymentMethod=1
GeneralTermsAccepted=true
我想要 JSON 格式的(比如):
"Email": "example1@1.nl",
"Coin": "BTC",
"CouponCode": "",
"AmountEuro": 80.0,
"AmountCoin": 1.0,
"CoinPriceInEuro": 80,
"CoinAddress": "17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M",
"TypeOrder": "buy",
"PaymentMethod": 1,
"GeneralTermsAccepted": false
附上你找到的代码。
谁能告诉我必须做什么才能将其放入正确的 json 中?
const express = require('express');
const http = require('http');
const app = express();
const fs=require('fs');
const hostname = '127.0.0.1';
const port = 3000;
const bodyParser = require('body-parser');
var jsonParser = bodyParser.json()
var urlencodedParser = bodyParser.urlencoded( extended: false )
fs.readFile('index.html', (err, html) =>
if(err)
throw err;
var server = http.createServer((req, res) =>
res.statusCode=200;
res.setHeader('Content-type', 'text/html');
res.write(html);
res.end();
);
server.listen(port, hostname, () =>
console.log('Server started on port'+port);
);
// POST /login gets urlencoded bodies
app.post('http://localhost:3030/rest/v1/PostOrder', urlencodedParser, function (req, res)
console.log(req.body);
if (!req.body) return res.sendStatus(400);
res.send('http://localhost:3030/rest/v1/PostOrder', qs:req.query);
);
);
<!DOCTYPE html>
<html>
<body>
<form enctype="text/plain" action="http://localhost:3030/rest/v1/PostOrder" method="POST">
Buy/Sell:<br>
<input type="text" name="TypeOrder" value="buy">
<br>
Coin:<br>
<input type="text" name="Coin" value="BTC">
Amount in Coin:<br>
<input type="number" name="AmountCoin" value="1">
<br>
Coin Price in Euro:<br>
<input type="number" name="CoinPriceInEuro" value="100">
<br>
Coin address to send:<br>
<input type="text" name="CoinAddress" value="17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M">
<br>
Payment method:<br>
<input type="radio" name="PaymentMethod" value="1" checked> iDeal<br>
<input type="radio" name="PaymentMethod" value="2"> Credit Card<br>
<input type="radio" name="PaymentMethod" value="3"> PayPal<br>
<br>
Terms accepted:<br>
<input type="radio" name="GeneralTermsAccepted" value="true" checked>Ja<br>
<input type="radio" name="GeneralTermsAccepted" value="false">No<br>
<br><br>
<input type="submit" value="Submit">
</form>
<p>If you click the "Submit" button, the form-data will be sent to a page called "/action_page.php".</p>
</body>
</htm
【问题讨论】:
【参考方案1】:因此,您可以执行以下操作:
const data = `
TypeOrder=buy
Coin=BTC
AmountCoin=1
CoinPriceInEuro=100
CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
PaymentMethod=1
GeneralTermsAccepted=true`;
let parts = data.split( '\n' );
let formattedData = ;
parts.forEach( ( part ) =>
const splitData = part.split( '=' );
formatterData[ splitData[ 0 ] ] = splitData[ 1 ];
);
这是一个非常简单的方法。您可以使用大量的库使其更面向功能或更简单。 :)
【讨论】:
为什么要硬编码?我需要将表单数据捕获为有效负载中的 json 而不是硬编码示例 这只是一个示例,无论您拥有多少数据都可以使用。【参考方案2】:无需在表单中将 enctype 指定为 text/plain。
只需正确删除它,因为您的节点应用程序已经使用 json 编码器作为中间件。
【讨论】:
【参考方案3】:这个呢:
let str=`TypeOrder=buy
Coin=BTC
AmountCoin=1
CoinPriceInEuro=100
CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
PaymentMethod=1
GeneralTermsAccepted=false`;
let result=str.split('\n').reduce((re, v) =>
let key=v.split('=')[0],val=v.split('=')[1];
if (val.match(/^\d+\.\d+$|^\d+$/))
val=Number(val);
else if(val.match(/^true$/i))
val=true;
else if(val.match(/^false$/i))
val=false;
re[key]=val;
return re;
, );
console.log(result);
【讨论】:
为什么要硬编码?我需要将表单数据捕获为有效负载中的 json 而不是硬编码示例【参考方案4】:正文数据由\n
分隔,因此您可以拆分然后循环该数组。
payload_template
是您的空模板,将填充正文数据。
片段
let body = `TypeOrder=buy
Coin=BTC
AmountCoin=1
CoinPriceInEuro=100
CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
PaymentMethod=1
GeneralTermsAccepted=true`;
let payload = ;
body.split('\n').forEach((c) => [key, payload[key]] = c.split('='));
console.log(payload);
.as-console-wrapper
max-height: 100% !important
【讨论】:
为什么要硬编码?我需要将表单数据捕获为有效负载中的 json 而不是硬编码示例 @user3394645 好的,你做动态 json 转换。请等一下!以上是关于如何使用节点将表单数据(文本/纯文本)转换为 json?的主要内容,如果未能解决你的问题,请参考以下文章