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

Zapier Cli未处理错误:文件哈希应用静默失败排查

解决Zapier文件哈希应用的静默失败问题

我开发了一款Zapier应用,核心功能是接收文件作为输入并返回其SHA256哈希值。正常输入文件时应用运行没问题,但如果输入非文件内容(比如字符串),应用会出现静默失败:只有日志里能看到模糊的堆栈跟踪,Zapier界面没有任何错误提示,还会返回错误的哈希值。

一开始我以为这个错误没法通过代码处理,而且日志里的堆栈信息乱码还模糊:

鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�Log 鈹�Unhandled error: Error: Error: Could not find the method to call: authentication.test 鈹�鈹�鈹�What happened: 鈹�鈹�鈹�Executing authentication.test with bundle 鈹�鈹�鈹�Error: Could not find the method to call: authentication.test 鈹�鈹�鈹�Error: Error: Could not find the method to call: authentication.test 鈹�鈹�鈹�at execute (:censored:9:d1ba0cf2aa:/node_modules/zapier-platform-core/src/execute.js:83:11) 鈹�鈹�鈹�at input (:censored:9:d1ba0cf2aa:/node_modules/zapier-platform-core/src/create-command-handler.js:26:12) 鈹�鈹�鈹�at Object.beforeMiddleware.then.newInput (:censored:9:d1ba0cf2aa:/node_modules/zapier-platform-core/src/middleware.js:90:22) 鈹�鈹�鈹�at bound (domain.js:280:14) 鈹�鈹�鈹�at Object.runBound (domain.js:293:12) 鈹�鈹�鈹�at Object.tryCatcher (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/util.js:16:23) 鈹�鈹�鈹�at Promise._settlePromiseFromHandler (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/promise.js:512:31) 鈹�鈹�鈹�at Promise._settlePromise (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/promise.js:569:18) 鈹�鈹�鈹�at Promise._settlePromise0 (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/promise.js:614:10) 鈹�鈹�鈹�at Promise._settlePromises (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/promise.js:693:18) 鈹�鈹�鈹�at Async._drainQueue (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/async.js:133:16) 鈹�鈹�鈹�at Async._drainQueues (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/async.js:143:10) 鈹�鈹�鈹�at Immediate.Async.drainQueues (:censored:9:d1ba0cf2aa:/node_modules/bluebird/js/release/async.js:17:14) 鈹�鈹�鈹�at runCallback (timers.js:672:20) 鈹�鈹�鈹�at tryOnImmediate (timers.js:645:5) 鈹�鈹�鈹�at processImmediate [as _immediateCallback] (timers.js:617:5) 鈹�鈹�Version 鈹�1.0.7 鈹�鈹�Step 鈹�鈹�鈹�Timestamp 鈹�2018-05-24T03:57:57-05:00 鈹�鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�

我的代码是基于Zapier的文件示例应用修改的,只替换了creates/uploadFile.js,原代码如下:

const request = require('request'); 
const crypto = require('crypto'); 

function hashStream(stream) { 
  const hash = crypto.createHash('sha256').setEncoding('hex'); 
  return new Promise((resolve, reject) => { 
    stream.pipe(hash) 
      .on('finish', () => resolve(hash.read())) 
      .on('error', reject) 
  }) 
} 

function hashFile(z, bundle) { 
  const fileStream = request(bundle.inputData.file); 
  return hashStream(fileStream).then((hash) => ({hash})); 
}; 

module.exports = { 
  key: 'hashFile', 
  noun: 'File', 
  display: { 
    label: 'Hash File', 
    description: 'Performs a sha256 on file.' 
  }, 
  operation: { 
    inputFields: [ 
      {key: 'file', required: true, type: 'file', label: 'File'}, 
    ], 
    perform: hashFile, 
    sample: { filename: 'example.pdf' }, 
    outputFields: [ 
      {key: 'hash', type: 'string', label: 'Hash'} 
    ], 
  } 
}; 

问题解决更新

后来我找到了问题根源:我之前默认request函数在请求失败时会直接抛出错误,但实际上它没有——反而会把错误页面的内容当成文件流来计算哈希,导致返回错误的哈希值。修改hashFile函数后解决了这个问题:

function hashFile(z, bundle) { 
  return new Promise((resolve, reject) => { 
    request(bundle.inputData.file) 
      .on('response', function ({statusCode}) { 
        if (200 === statusCode) { 
          hashStream(this).then((hash) => resolve({hash})); 
        } else { 
          reject(new Error(`Invalid status code ${statusCode}`)); 
        } 
      }) 
      .on('error', (err) => reject(err)) 
  }) 
} 

不过还有个遗留问题:我没法捕获日志里的“未处理错误”。我试过用下面的代码,但完全没效果,猜测是Zapier引擎限制了这类全局事件监听:

process.on('unhandledRejection', (reason, p) => { 
  console.log('Unhandled Rejection at:', p, 'reason:', reason); 
  process.exit(1); 
}); 

内容的提问来源于stack exchange,提问作者max-lt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:19:08