Zapier Cli - необработанная ошибка - PullRequest
0 голосов
/ 24 мая 2018

Я создаю приложение, которое (пока) принимает файл в качестве ввода , а возвращает его хэш (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                                                                                                        │
└───────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

Мой код по сути является копией "Файлов"Пример приложения с заменой файла 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, безусловно, хэшировала страницу ошибки.

Изменение функции 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))
    })
}

Но: Iне могу отловить «необработанные ошибки» ;Я пробовал с

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

, но я думаю, что движок Zapier предотвращает подобные трюки, потому что он не имеет никакого эффекта ...

1 Ответ

0 голосов
/ 24 мая 2018

Дэвид здесь, из команды Zapier Platform.Там нет магии или трюков, но похоже, что вы делаете жизнь немного сложнее для себя.Большая часть кода Zapier не поддерживает этот шаблон событий (.on('x', function(){...)).Вместо этого все уже использует обещания.Необработанный отказ относится к отклоненному обещанию, которое вы не выполняете с предложением catch.Мы также предоставляем функцию z.request, которая будет работать немного лучше, чем использование самого пакета request (хотя это разрешено, если вы хотите!).Ознакомьтесь с разделом документации о выполнении HTTP-запросов .У нас также есть метод z.hash(algo, string).и затем обновите ваш код, чтобы он выглядел примерно так:

function hashFile(z, bundle) {
    return z.request(bundle.inputData.file).then(response => {
      if (response.code !== 200) {
        throw new Error('something bad')
      }
      // might need to pull something else out of the response 
      // if response.content isn't the string contents of the file
      return {hash: z.hash('sha256', response.content)}
    })
};

Мы также упростили модульное тестирование вашего кода - если он работает локально, он будет работать и на наших серверах.Опять нет волшебства!?

...