You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中访问JSON二级值报错?请求数据读取问题排查

问题分析与修复方案

核心错误点

  1. 数组访问错误:请求JSON里的header是数组类型([{"value": "21"}]),但代码里直接用request.body.header.value访问——数组没有value属性,自然会抛出Cannot read properties of undefined错误。
  2. 拼写失误:backFields里有一处request.bodyback[0].value,多打了字母,应该是request.body.back[0].value。
  3. 颜色格式重复:请求中的foregroundColour和backgroundColour已经带#前缀(比如#FFFFFF),但hexToRgb函数里又拼接了#,变成##FFFFFF,导致parseInt无法正确解析十六进制值。

修复后的完整代码

const functions = require("firebase-functions");
const { PKPass } = require("passkit-generator");
const admin = require("firebase-admin");
var fs = require("file-system");
var path = require("path");
var axios = require("axios");

admin.initializeApp(functions.config().firebase);
var storageRef = admin.storage().bucket()

function hexToRgb(hex) {
    // 移除重复的#前缀,避免解析失败
    hex = hex.replace(/^#/, "");
    var bigint = parseInt(hex, 16);
    var r = (bigint >> 16) & 255;
    var g = (bigint >> 8) & 255;
    var b = bigint & 255;

    return `rgb(${r}, ${g}, ${b})`;
}

exports.pass = functions.https.onRequest((request, response) => {
    PKPass.from({
        model: "./model/BoardingPass.pass",
        certificates: {
            wwdr: fs.fs.readFileSync("./certs/wwdr.pem"),
            signerCert: fs.fs.readFileSync("./certs/passIdentifierSignerCert.pem"),
            signerKey: fs.fs.readFileSync("./certs/passIdentifierSignerKey.pem"),
            signerKeyPassphrase: "PASSPHRASE"
        },
    },
    {
        authenticationToken: "AUTHTOKEN",
        webServiceURL: "WEBSERVICEURL",
        serialNumber: request.body.serialNumber,
        description: request.body.description,
        logoText: request.body.logoText,
        foregroundColor: hexToRgb(request.body.foregroundColour),
        backgroundColor: hexToRgb(request.body.backgroundColour)

    })
    .then(async (newPass) => {
        // 修复header数组访问方式
        newPass.headerFields.push(
            {
                key: "gate",
                label: "GATE",
                value: request.body.header[0].value
            }
        )
        newPass.primaryFields.push(
            {
                key: "depart",
                label: request.body.primary[0].label,
                value: request.body.primary[0].value
            },
            {
                key: "arrive",
                label: request.body.primary[1].label,
                value: request.body.primary[1].value
            }
        )
        newPass.secondaryFields.push(
            {
                key: "passenger",
                label: "PASSENGER",
                value: request.body.secondary.value
            }
        )
        newPass.auxiliaryFields.push(
            {
                key: "boardingTime",
                label: "DEPART",
                value: request.body.auxiliary[0].value
            },
            {
                key: "flightNewName",
                label: "FLIGHT",
                value: request.body.auxiliary[1].value
            },
            {
                key: "class",
                label: "CLASS",
                value: request.body.auxiliary[2].value
            },
            {
                key: "date",
                label: "DATE",
                value: request.body.auxiliary[3].value
            }
        )
        newPass.backFields.push(
            // 修复拼写错误
            {
                key: "passport",
                label: "PASSPORT",
                value: request.body.back[0].value
            },
            {
                key: "residence",
                label: "RESIDENCE",
                value: request.body.back[1].value
            }
        )

        newPass.setBarcodes({
            message: request.body.barcode,
            format: "PKBarcodeFormatPDF417",
            messageEncoding: "iso-8859-1"
        })

        const resp = await axios.get(request.body.thumbnail, { responseType: 'arraybuffer' })
        const buffer = Buffer.from(resp.data, "utf-8")
        newPass.addBuffer("thumbnail.png", buffer)
        newPass.addBuffer("thumbnail@2x.png", buffer)
        const bufferData = newPass.getAsBuffer();
        fs.writeFileSync("new.pkpass", bufferData)
        storageRef.file("passes/boardingPass.pkpass")
            .save(bufferData, (error) => {
                if (!error) {
                    console.log("Pass was uploaded successfully.");
                    response.status(200).send("Pass uploaded successfully");
                }
                else {
                    console.error("There was an error uploading pass", error);
                    response.status(400).send("Error uploading pass");
                }
            })
    })
    // 全局捕获错误,避免函数崩溃
    .catch(error => {
        console.error("Error generating pass", error);
        response.status(500).send("Error generating pass");
    })
});

额外优化建议

  • 加输入验证:使用request.body数据前,检查字段是否存在,比如if (!request.body.header?.[0]?.value),避免请求数据缺失导致的错误。
  • 用解构赋值:可以简化代码,比如const { header, primary, secondary } = request.body;,后续直接用header[0].value,可读性更高。
  • 完善响应逻辑:原代码只设置了状态码,没有返回响应内容,修复后添加了对应提示,方便调试。

内容的提问来源于stack exchange,提问作者Person2099

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 14:28:08