JavaScript中访问JSON二级值报错?请求数据读取问题排查
问题分析与修复方案
核心错误点
- 数组访问错误:请求JSON里的
header是数组类型([{"value": "21"}]),但代码里直接用request.body.header.value访问——数组没有value属性,自然会抛出Cannot read properties of undefined错误。 - 拼写失误:
backFields里有一处request.bodyback[0].value,多打了字母,应该是request.body.back[0].value。 - 颜色格式重复:请求中的
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
相关产品推荐
相关产品推荐

