javascript - 在谷歌云功能中保存到数据库时不完整的 JSON 数据
问题描述
我现在正在尝试如何将 Google 云功能用作我的 IOT 应用程序的一部分。
但是当我向触发器端点发送 JSON POST 时遇到问题。有时它工作得很好,有时有效载荷六角形在中间被切割。
例如,原始有效载荷十六进制为“0011029e02ffb1ffd6ffd8ffdaffe0fff500000008”,有时在将其保存到数据库时会突然变为“0011029e02ffb1”。
我如何测试端点是我将使用 Postman 发送一个 HTTP POST,其中包含以下数据。
{
"DevEUI_uplink": {
"DevEUI": "BC9740FFFE10549E",
"payload_hex": "0011029e02ffb1ffd6ffd8ffdaffe0fff500000008",
}}
云函数内部是 nodejs12 代码:
/**
* Responds to any HTTP request.
*
* @param {!express:Request} req HTTP request context.
* @param {!express:Response} res HTTP response context.
*/
const moment = require("moment");
const mysql = require("mysql");
require("dotenv").config();
exports.saveFunction = (req, res) => {
let now = moment().format('YYYY-MM-DD HH:mm:ss');
let deveui = req.body.DevEUI_uplink.DevEUI;
let payload = req.body.DevEUI_uplink.payload_hex;
function convertTempData(data) {
data = parseInt(data, 16);
if ((data & 0x8000) > 0) {
data = data - 0x10000;
}
return data;
}
// Slice the Request Data
let raw_payload = payload;
let version = parseInt(payload.slice(0, 2), 16);
let gem1 = parseInt(payload.slice(2, 4), 16);
let gem2 = parseInt(payload.slice(4, 6), 16);
let battery = parseInt(payload.slice(6, 8), 16) / 2;
let payload_id = parseInt(payload.slice(8, 10), 16);
let tempNow = convertTempData(payload.slice(10, 14));
let tempVar1 = convertTempData(payload.slice(14, 18));
let tempVar2 = convertTempData(payload.slice(18, 22));
let tempVar3 = convertTempData(payload.slice(22, 26));
let tempVar4 = convertTempData(payload.slice(26, 30));
let tempVar5 = convertTempData(payload.slice(30, 34));
let tempVar6 = convertTempData(payload.slice(34, 38));
let tempVar7 = convertTempData(payload.slice(38, 42));
// Connection String
const conn = mysql.createConnection({
host: process.env.SERVER_HOST,
user: process.env.SERVER_USER,
password: process.env.SERVER_PASS,
database: process.env.SERVER_DB,
port: process.env.SERVER_PORT,
});
conn.connect(function (err) {
if (err) {
return res
.status(404)
.json({ message: "Invalid Request", error: err.message });
}
var sqlcoms =
"UPDATE sd_payload SET payload = '" +
raw_payload +
"' , version='" +
version +
"', gem1='" +
gem1 +
"' , gem2='" +
gem2 +
"' , battery='" +
battery +
"',payload_id='" +
payload_id +
"',tempNow='" +
tempNow +
"',tempVar1='" +
tempVar1 +
"',tempVar2='" +
tempVar2 +
"',tempVar3='" +
tempVar3 +
"',tempVar4='" +
tempVar4 +
"',tempVar5='" +
tempVar5 +
"',tempVar6='" +
tempVar6 +
"',tempVar7='" +
tempVar7 +
"',updated_at='" +
now +
"' WHERE DevEUI = '" +
deveui +
"'";
conn.query(sqlcoms, function (err, result) {
if (err) {
return res
.status(404)
.json({ message: "Invalid Request", error: err.message });
}
return res.status(201).json(result);
});
});
};
我想将整个有效负载保存到数据库中以进行检查。您能否告知为什么 post json 正文在某些插入中被中途切割,而某些插入将是完整的?
解决方案
我建议首先console.log(payload)
验证该功能是否已完整接收它,或者它是否在途中被切碎。
推荐阅读
- python - 有没有办法创建任务管理器 Django 应用程序?
- python - 在 Python Markdown 中用自定义替换 Markdown 标题标签
- java - 如何利用presto jdbc连接池
- java - 绕过 Json jackson 和 lombok 构造函数要求
- timer - 如何从表盘访问谷歌倒计时的剩余时间?
- reactjs - 在 react-select-search 输入名称时,结果被填充
- javascript - 如何从具有不同域的 iFrame 发送帖子消息?
- php - 如何解析和获取来自给定网址的元标记的图像和描述?
- laravel - Laravel 存储图像未加载
- php - 如何在共享主机中使用 PHP 在视频上添加文本水印