Безсерверная структура TypeError: e не является функцией - PullRequest
1 голос
/ 30 октября 2019

Я использую serverless-framework для планирования задач в AWS.

Моя структура приложения

|- src
   |- tasks
      |- analytics.task.js
|- tasks.js
|- serverless.yml

Содержимое analytics.task.js

module.exports.run = (event, context, callback) => {
    console.log('Getting data...');

    console.log('success');
};

Для тестирования удалены все другие коды из метода запуска.

содержимое tasks.js

const analyticsTask = require('./src/tasks/analytics.task');

module.exports.analytics = analyticsTask.run();

и содержимое serverless.yml

functions:
  analyticsDataProcess:
    handler: tasks.analytics
    description: 'Send analytics data to the backend server'
    events:
      - schedule:
          name: analytics-data-process-task
          description: 'Send analytics data every minute'
          rate: rate(1 minute)
          enabled: true

Но при запускезадача, это дает ошибку

{
    "errorMessage": "e is not a function",
    "errorType": "TypeError",
    "stackTrace": [
        "TypeError: e is not a function",
        "    at /home/user/code/user/qcg-app/serverless_sdk/index.js:9:88073",
        "    at resolve (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/lib/plugins/aws/invokeLocal/index.js:692:30)",
        "    at Promise._execute (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/debuggability.js:411:9)",
        "    at Promise._resolveFromExecutor (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:518:18)",
        "    at new Promise (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:103:10)",
        "    at AwsInvokeLocal.invokeLocalNodeJs (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/lib/plugins/aws/invokeLocal/index.js:645:12)",
        "    at AwsInvokeLocal.invokeLocal (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/lib/plugins/aws/invokeLocal/index.js:155:19)",
        "    at AwsInvokeLocal.tryCatcher (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/util.js:16:23)",
        "    at Promise._settlePromiseFromHandler (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:547:31)",
        "    at Promise._settlePromise (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:604:18)",
        "    at Promise._settlePromiseCtx (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/promise.js:641:10)",
        "    at _drainQueueStep (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:97:12)",
        "    at _drainQueue (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:86:9)",
        "    at Async._drainQueues (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:102:5)",
        "    at Immediate.Async.drainQueues [as _onImmediate] (/home/user/.nvm/versions/node/v10.15.3/lib/node_modules/serverless/node_modules/bluebird/js/release/async.js:15:14)",
        "    at runCallback (timers.js:705:18)",
        "    at tryOnImmediate (timers.js:676:5)",
        "    at processImmediate (timers.js:658:5)",
        "    at process.topLevelDomainCallback (domain.js:120:23)"
    ]
}

1 Ответ

1 голос
/ 30 октября 2019

Хорошо, похоже, здесь происходит несколько вещей.

Во-первых, ожидается, что ваш обработчик возвращает функцию, которая может быть вызвана лямбда-выражением. В этом случае вы вызываете обработчик, а не возвращаете функцию, которая будет вызываться лямбда-выражением.

Чтобы решить эту проблему, удалите скобки после run в task.js

const analyticsTask = require('./src/tasks/analytics.task');

module.exports.analytics = analyticsTask.run;

Есть еще одна проблема - лямбда-обработчики должны быть асинхронными функциями. Поэтому вам нужно будет добавить async перед функцией, экспортированной как run в analytics.task.js. Теперь вы можете удалить аргумент обратного вызова. Альтернативой было бы опустить асинхронное, но на самом деле вызвать обратный вызов. Поскольку мы предпочитаем более новый синтаксис узла, давайте удалим аргумент обратного вызова в пользу асинхронного.

module.exports.run = async (event, context) => {
    console.log('Getting data...');

    console.log('success');
};
...