如何修复dagID = result[0].dag_id行触发的TypeError报错
报错根因
这个错误是两个代码逻辑问题叠加导致的:
- 你在代码末尾直接无参调用
determineCron(),函数形参result拿到的值是undefined,执行result[0]时相当于在undefined上读取索引0对应的属性,直接触发类型错误。 - 就算你正确传入了result参数,后续
bqConnection().query()是异步返回Promise的方法,你没有等待结果返回就直接读取job[0],后续还会触发一模一样的类型错误;另外你代码里的变量都没有加const/let声明,会意外污染全局作用域。
修复方案
按以下顺序修改代码即可解决:
- 删掉末尾裸调用的无参
determineCron(),等accessData里处理完result数组后,把result作为参数传入determineCron调用。 - 所有读取数组索引的位置前加合法性校验,避免空数组、非数组入参导致的属性读取错误。
- 给异步的数据库查询加
await等待结果返回,所有局部变量加声明关键字。
修复后的可运行代码:
async function accessData(){ const access = await main(); const result = access.dag_runs.map(file => ({ start_date: file.start_date, end_date: file.end_date, state: file.state, dag_run_id: file.dag_run_id, dag_id: file.dag_id })) console.log(result); /*await bqConnection() .dataset('IPP_SLA') .table('sla_table') .insert(result);*/ console.log(`Inserted ${result.length} rows`) // 拿到处理好的result后传参调用 await determineCron(result) } async function determineCron(result){ // 入参合法性校验 if (!Array.isArray(result) || result.length === 0) { console.warn('dag_runs数据为空,跳过cron计算逻辑') return } const dagID = result[0].dag_id // 等待异步查询结果返回,直接解构拿到第一条数据 const [cronConfig] = await bqConnection().query(`SELECT * FROM \`np-inventory-planning-thd.IPP_SLA.expected_sla\` where dag_id = "${dagID}"`) if (!cronConfig) { console.warn(`未查询到dag_id为${dagID}的cron配置`) return } const cronTime = cronConfig.cron_time const interval = parser.parseExpression(cronTime); console.log('Next run date: ', interval.next().toString()); } // 启动入口 accessData()
额外提醒:直接拼接字符串生成SQL存在注入风险,如果dag_id来源不可信,建议替换为对应数据库驱动支持的参数化查询写法。
内容的提问来源于stack exchange,提问作者Josh Anderson
相关产品推荐
相关产品推荐

