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
相关产品推荐
相关产品推荐

