首页 > 解决方案 > 在谷歌云功能中保存到数据库时不完整的 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 正文在某些插入中被中途切割,而某些插入将是完整的?

标签: javascriptnode.jsjsongoogle-cloud-functions

解决方案


我建议首先console.log(payload)验证该功能是否已完整接收它,或者它是否在途中被切碎。


推荐阅读