Lỗi AWS Lambda: “Không thể tìm thấy mô-đun '/ var / task / index'”


87

Vấn đề về tác vụ Alexa của Node.js

Tôi hiện đang mã hóa Nhiệm vụ Alexa của Node.js qua AWS Lambda và tôi đang cố gắng mã hóa một hàm nhận thông tin từ API OpenWeather và phân tích cú pháp nó thành một biến được gọi là weather. Mã liên quan như sau:

var request = require('request');
var weather = "";
function isBadWeather(location) {
      var endpoint = "http://api.openweathermap.org/data/2.5/weather?q=" + location + "&APPID=205283d9c9211b776d3580d5de5d6338";
      var body = "";
      request(endpoint, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                  body = JSON.parse(body);
                  weather = body.weather[0].id;
            }
      });
}

function testWeather()
{
      setTimeout(function() {
      if (weather >= 200 && weather < 800)
            weather = true;
      else
            weather = false;
      console.log(weather);
      generateResponse(buildSpeechletResponse(weather, true), {});
      }, 500);
}

Tôi đã chạy đoạn mã này vô số lần trong Cloud9 và các IDE khác, và nó dường như đang hoạt động hoàn hảo. Tuy nhiên, khi tôi nén nó vào một gói và tải nó lên AWS Lambda, tôi gặp lỗi sau:

{
    "errorMessage": "Cannot find module '/var/task/index'",
    "errorType": "Error",
    "stackTrace": [
        "Function.Module._load (module.js:276:25)",
        "Module.require (module.js:353:17)",
        "require (internal/module.js:12:17)"
    ]
}

Tôi đã tìm kiếm vô số bài báo và cài đặt module-js, request và nhiều mô-đun Node khác có thể làm cho mã này chạy, nhưng dường như không có gì khắc phục được vấn đề này. Đây là thư mục của tôi, đề phòng:

- planyr.zip
   - index.js
   - node_modules
   - package.json

Có ai biết vấn đề có thể là gì không? Cảm ơn trước.


Đây là kết quả log cho mã của tôi: START RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Version: $LATEST Unable to import module 'index': Error at Function.Module._resolveFilename (module.js:325:15) at Function.Module._load (module.js:276:25) at Module.require (module.js:353:17) at require (internal/module.js:12:17) END RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 REPORT RequestId: 46c71292-debf-11e6-a013-1be2c415a9c1 Duration: 55.76 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 16 MB
Anthony Krivonos

3
Ngoài câu trả lời về cách nén bằng terminal trên máy Mac, hãy đảm bảo rằng tệp mã của bạn được gọi là 'index.js'. Tên của tôi có nhiều mô tả hơn, tạo ra lỗi.
nghệ

1
@Art Đây là vấn đề của tôi. Tôi đã nén một test.js và nó xuất hiện một lỗi không được khắc phục. Sau khi thay đổi nó thành index.js, nó hoạt động tốt. Cảm ơn.
Hudspeth

Câu trả lời:


229

Đã sửa nó! Vấn đề của tôi là tôi đã cố nén tệp bằng chức năng nén tích hợp của máy Mac trong Finder.

Nếu bạn là người dùng Mac, như tôi, bạn nên chạy các kịch bản sau đây trong thiết bị đầu cuối khi bạn đang ở trong thư mục gốc của dự án của bạn (thư mục chứa của bạn index.js, node_modulesvv tập tin).

zip -r ../yourfilename.zip *

Cho cửa sổ:

Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.zip

7
tôi đã nén như vậy: "zip -r folder folder.zip" và tất nhiên điều này không thành công. thanks for the tip chỉ nén các tập tin và thư mục không phải là
Dane Macaulay

6
Làm thế nào về cửa sổ?
Alok Rajasukumaran,

cũng nhớ đặt tên cho hàmindex.js
Kiến thức

Có cách nào để làm điều này từ bên ngoài thư mục không?
andrhamm

1
@andrhamm Có. Định dạng là zip -r /path/to/destination.zip /path/to/source/directory/*. Điều đó nén nội dung của thư mục. Nếu bạn cũng muốn nén thư mục đó, hãy sử dụng / path / to / source / thư mục mà không có dấu *.
Qaz

23

Cập nhật câu trả lời được chấp nhận: Khi lỗi này xảy ra, điều đó có nghĩa là tệp zip của bạn không ở dạng hợp lệ mà AWS yêu cầu.

Nếu bạn nhấp đúp vào zip, bạn sẽ tìm thấy thư mục bên trong tệp mã của bạn, nhưng lambda muốn điều đó khi bạn nhấp đúp vào zip, nó sẽ hiển thị các tệp mã trực tiếp.

Để đạt được điều này:

open terminal  
cd your-lambda-folder 
zip -r index.zip *

Sau đó, tải lên index.zipAWS Lambda.


trong cửa sổ git khốn ném lỗi "lệnh không tìm thấy", làm thế nào để giải quyết vấn đề này bất kỳ ý tưởng?
Pardeep Jain

1
Đây là lệnh của Ubuntu, xin vui lòng google nó cho các cửa sổ hoặc làm thế nào để tạo ra zip từ command prompt
Ashutosh Jha

20

Kiểm tra xem tên tệp và tên trình xử lý có giống nhau không:

Trong trường hợp này, chúng tôi hy vọng rằng tất cả mã của chúng tôi sẽ nằm trong tệp <code> pack.ls </code>

Điều đó có nghĩa là ziptệp đó có bundle.jstệp xuất handlerchức năng:

exports.handler = (event, context, callback) => {//...}

4

Trong trường hợp của tôi, đó là do tôi có tệp xử lý trong thư mục src bên trong.

Tôi đã phải thay đổi thuộc tính 'Handler' trong Lambda từ:

index.handler

đến

src/index.handler

Tôi cũng chạy vào điều này; [Windows] chỉ đơn giản là tôi đã nhấp chuột phải vào APIphần repo của mình và sử dụng Send To > Compressed Folder. Điều này tạo ra một zip có cấu trúc api/etc, do đó ngoại lệ!
C Bauer

3

Đây có thể là vấn đề về quyền với các tệp bên trong tệp nén triển khai của bạn. Hãy thử chmod 777các tệp của bạn trước khi đóng gói chúng trong một tệp zip.


2
Thật không may, điều đó dường như không giải quyết được vấn đề. Tôi đã thử nén planyrthư mục trong một thư mục khác nhưng không có kết quả. Tên trình xử lý và tên tệp JavaScript chính của tôi khớp với ( index).
Anthony Krivonos

chmod 777là một lời khuyên tồi ... đây là mở quyền cho công chúng để viết, đọc và thực thi. Hãy luôn tìm ra nguyên nhân gây ra sự cố. Luôn cố gắng hiểu ý nghĩa bảo mật của việc thực hiện bất kỳ điều gì mà ai đó trên internet yêu cầu bạn làm. Bảo mật là quan trọng và phải có trong mã của chúng tôi theo mặc định.
Exadra37

3

Trong trường hợp của tôi, kho lưu trữ chứa một thư mục "src" với tệp index.js, vì vậy tôi phải đặt vào trình xử lý: "src / index.handler"

nhập mô tả hình ảnh ở đây


0

Trong trường hợp của tôi, tôi đã phải thay thế

exports.handler = function eventHandler (event, context) {

với

exports.handler = function (event, context, callback) {

0

Tôi gặp lỗi này khi tôi đang sử dụng lambci/lambda:nodejs8.10trong windows.

Tôi đã thử tất cả các giải pháp được liệt kê ở trên nhưng không giải pháp nào có thể giúp tôi giải quyết vấn đề của mình (mặc dù ngăn xếp lỗi trông giống như câu hỏi).

Đây là giải pháp đơn giản của tôi:

  1. sử dụng --entrypointcờ để chạy một vùng chứa để tìm xem tệp có được gắn vào vùng chứa hay không. Hóa ra tôi có thể gặp sự cố ổ chia sẻ với Máy tính để bàn Docker của mình.
  2. Tôi đã chuyển đổi trình nền docker của mình vào ngày hôm đó, nhưng mọi thứ đều hoạt động tốt ngoại trừ vấn đề này.
  3. Dù sao, gắn lại ổ đĩa của tôi vào Docker Desktop, bạn có thể sử dụng cả dockerlệnh hoặc chỉ cần mở cài đặt Docker Desktop để áp dụng.

0

Trong trường hợp của tôi, điều này là do Node hết bộ nhớ. Tôi đã sửa điều đó bằng cách thêm --memory-size 1500vào aws lambda create-function ...lệnh của mình .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.