Как транслировать машинописный текст с помощью веб-пакета для совместимости с AWS Sam-cli - PullRequest
0 голосов
/ 09 февраля 2019

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

Если я просто запускаю tscи переносить мой код, лямбда-функция работает нормально, поэтому мой вопрос: можно ли переносить машинописный текст с помощью веб-пакета, не добавляя в него все дополнительные компоненты модуля веб-пакета?Или, если нет, у вас есть другие предложения, чтобы моя сборка была совместима с AWS sam-cli

Ошибка, которую я получаю с моим текущим кодом, это TypeError: обработчик не является функцией

Thisмой вывод из веб-пакета

exports["handler"] =
/******/ (function(modules) { // webpackBootstrap
/******/    // The module cache
/******/    var installedModules = {};
/******/
/******/    // The require function
/******/    function __webpack_require__(moduleId) {
/******/
/******/        // Check if module is in cache
/******/        if(installedModules[moduleId]) {
/******/            return                     
installedModules[moduleId].exports;
/******/        }
/******/        // Create a new module (and put it into the         
cache)
/******/        var module = installedModules[moduleId] = {
/******/            i: moduleId,
/******/            l: false,
/******/            exports: {}
/******/        };
/******/
/******/        // Execute the module function
/******/        modules[moduleId].call(module.exports, module, 
module.exports, __webpack_require__);
/******/
/******/        // Flag the module as loaded
/******/        module.l = true;
/******/
/******/        // Return the exports of the module
/******/        return module.exports;
/******/    }
/******/
/******/
/******/    // expose the modules object (__webpack_modules__)
/******/    __webpack_require__.m = modules;
/******/
/******/    // expose the module cache
/******/    __webpack_require__.c = installedModules;
/******/
/******/    // define getter function for harmony exports
/******/    __webpack_require__.d = function(exports, name, getter)     
{
/******/        if(!__webpack_require__.o(exports, name)) {
/******/            Object.defineProperty(exports, name, { 
enumerable: true, get: getter });
/******/        }
/******/    };
/******/
/******/    // define __esModule on exports
/******/    __webpack_require__.r = function(exports) {
/******/        if(typeof Symbol !== 'undefined' && 
Symbol.toStringTag) {
/******/            Object.defineProperty(exports, 
Symbol.toStringTag, { value: 'Module' });
/******/        }
/******/        Object.defineProperty(exports, '__esModule', { 
value: true });
/******/    };
/******/
/******/    // create a fake namespace object
/******/    // mode & 1: value is a module id, require it
/******/    // mode & 2: merge all properties of value into the ns
/******/    // mode & 4: return value when already ns object
/******/    // mode & 8|1: behave like require
/******/    __webpack_require__.t = function(value, mode) {
/******/        if(mode & 1) value = __webpack_require__(value);
/******/        if(mode & 8) return value;
/******/        if((mode & 4) && typeof value === 'object' && 
value && value.__esModule) return value;
/******/        var ns = Object.create(null);
/******/        __webpack_require__.r(ns);
/******/        Object.defineProperty(ns, 'default', { 
enumerable: true, value: value });
/******/        if(mode & 2 && typeof value != 'string') for(var 
key in value) __webpack_require__.d(ns, key, function(key) { return 
value[key]; }.bind(null, key));
/******/        return ns;
/******/    };
/******/
/******/    // getDefaultExport function for compatibility with non- 
harmony modules
/******/    __webpack_require__.n = function(module) {
/******/        var getter = module && module.__esModule ?
/******/            function getDefault() { return 
module['default']; } :
/******/            function getModuleExports() { return 
module; };
/******/        __webpack_require__.d(getter, 'a', getter);
/******/        return getter;
/******/    };
/******/
/******/    // Object.prototype.hasOwnProperty.call
/******/    __webpack_require__.o = function(object, property) { 
return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/    // __webpack_public_path__
/******/    __webpack_require__.p = "";
/******/
/******/
/******/    // Load entry module and return exports
/******/    return __webpack_require__(__webpack_require__.s = 
"./src/lambda/users/register/index.ts");
/******/ })

 /**************************************************************/
/******/ ({

/***/ "./src/lambda/users/register/index.ts":
/*!********************************************!*\
  !*** ./src/lambda/users/register/index.ts ***!
  \********************************************/
/*! exports provided: handler */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export 
(binding) */ __webpack_require__.d(__webpack_exports__, \"handler\", 
function() { return handler; });\n\nvar __awaiter = (undefined && 
undefined.__awaiter) || function (thisArg, _arguments, P, generator) 
{\n    return new (P || (P = Promise))(function (resolve, reject) 
{\n        function fulfilled(value) { try { 
step(generator.next(value)); } catch (e) { reject(e); } }\n        
function rejected(value) { try { step(generator[\"throw\"](value)); 
} catch (e) { reject(e); } }\n        function step(result) { 
result.done ? resolve(result.value) : new P(function (resolve) { 
resolve(result.value); }).then(fulfilled, rejected); }\n        
step((generator = generator.apply(thisArg, _arguments || 
[])).next());\n    });\n};\nvar __generator = (undefined && 
undefined.__generator) || function (thisArg, body) {\n    var _ = { 
label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1];  
}, trys: [], ops: [] }, f, y, t, g;\n    return g = { next: verb(0), 
\"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === 
\"function\" && (g[Symbol.iterator] = function() { return this; }), 
g;\n    function verb(n) { return function (v) { return step([n, 
v]); }; }\n    function step(op) {\n        if (f) throw new 
TypeError(\"Generator is already executing.\");\n        while (_) 
try {\n            if (f = 1, y && (t = y[op[0] & 2 ? \"return\" : 
op[0] ? \"throw\" : \"next\"]) && !(t = t.call(y, op[1])).done) 
return t;\n            if (y = 0, t) op = [0, t.value];\n            
switch (op[0]) {\n                case 0: case 1: t = op; break;\n                
case 4: _.label++; return { value: op[1], done: false };\n                
case 5: _.label++; y = op[1]; op = [0]; continue;\n                
case 7: op = _.ops.pop(); _.trys.pop(); continue;\n                
default:\n                    if (!(t = _.trys, t = t.length > 0 && 
t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; 
}\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && 
op[1] < t[3]))) { _.label = op[1]; break; }\n                    if 
(op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                    
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; 
}\n                    if (t[2]) _.ops.pop();\n                    
_.trys.pop(); continue;\n            }\n            op = 
body.call(thisArg, _);\n        } catch (e) { op = [6, e]; y = 0; } 
finally { f = t = 0; }\n        if (op[0] & 5) throw op[1]; return { 
value: op[0] ? op[1] : void 0, done: true };\n    }\n};\nvar _this = 
undefined;\nvar handler = function (event) {\n    if (event === void 
 0) { event = {}; }\n    return __awaiter(_this, void 0, void 0, 
 function () {\n        var response;\n        return 
__generator(this, function (_a) {\n            console.log('Hello 
World!');\n            response = JSON.stringify(event, null, 2);\n            
return [2 /*return*/, 'success'];\n        });\n    });\n};\n\n\n//# 
sourceURL=webpack://handler/./src/lambda/users/register/index.ts?");

/***/ })

/******/ });

Это оригинальный код src

'use strict'
export const handler = async (event: any = {}): Promise<any> => {
    console.log('Hello World!');
    const response = JSON.stringify(event, null, 2);
    return response;
}

Это скомпилированный код tsc, который запускается (я получаю сообщение об ошибке, но я знаю, почему этопроисходит, и это не проблема, чтобы исправить)

 'use strict';
 var __awaiter = (this && this.__awaiter) || function (thisArg, 
_arguments, P, generator) {
    return new (P || (P = Promise))(function (resolve, reject) {
         function fulfilled(value) { try {           
step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"] . 
 (value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) 
: new P(function (resolve) { resolve(result.value); 
 }).then(fulfilled, rejected); }
         step((generator = generator.apply(thisArg, _arguments || 
 [])).next());
     });
};
var __generator = (this && this.__generator) || function (thisArg, 
 body) {
     var _ = { label: 0, sent: function() { if (t[0] & 1) throw 
 t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) 
 }, typeof Symbol === "function" && (g[Symbol.iterator] = function() 
{ return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); };  
}
     function step(op) {
         if (f) throw new TypeError("Generator is already 
executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? 
 y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t 
 = t.call(y, op[1])).done) return t;
             if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: 
 false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                 default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length 
 - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                     if (op[0] === 3 && (!t || (op[1] > t[0] && 
 op[1] < t[3]))) { _.label = op[1]; break; }
                     if (op[0] === 6 && _.label < t[1]) { _.label = 
 t[1]; t = op; break; }
                     if (t && _.label < t[2]) { _.label = t[2]; 
 _.ops.push(op); break; }
                     if (t[2]) _.ops.pop();
                     _.trys.pop(); continue;
             }
             op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
         if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : 
 void 0, done: true };
     }
 };
var _this = this;
exports.__esModule = true;
 exports.handler = function (event) {
     if (event === void 0) { event = {}; }
    return __awaiter(_this, void 0, void 0, function () {
         var response;
         return __generator(this, function (_a) {
             console.log('Hello World!');
             response = JSON.stringify(event, null, 2);
             return [2 /*return*/, 'success'];
         });
        });
 };

Я пробовал несколько различных libraryTargets, но ни один из них не работал

1 Ответ

0 голосов
/ 09 февраля 2019

Хороший вопрос для нового пользователя!Вот что (я думаю) было бы решением.


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

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

Итак, как сказать webpack не включать библиотеки, о которых сервер уже "знает"«?Простой ансер, используйте параметр external в вашем webpack.config.js.Пример:

// in webpack.config.js
module.exports = {
  // ...
  externals: {
    react: 'react', // tells webpack not to include the react package inside its bundle
  }
}

Кстати, почему tsc "работает", так как только переносит код, но не связка все, что нужно вашему исходному коду внутри одного файла.

...