AWS लैंबडा त्रुटि: "मॉड्यूल '/ var / कार्य / अनुक्रमणिका नहीं ढूँढ सकता"


87

Node.js एलेक्सा टास्क इश्यू

मैं वर्तमान में AWS लैम्ब्डा के माध्यम से एक Node.js एलेक्सा टास्क को कोड कर रहा हूं, और मैं एक फ़ंक्शन को कोड करने की कोशिश कर रहा हूं जो OpenWeather API से जानकारी प्राप्त करता है और इसे एक चर में बुलाया जाता है weather। प्रासंगिक कोड इस प्रकार है:

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);
}

मैंने इस स्निपेट को अनगिनत बार Cloud9 और अन्य IDEs में चलाया, और यह त्रुटिपूर्ण रूप से काम करता हुआ प्रतीत होता है। हालाँकि, जब मैं इसे एक पैकेज में जोड़ता हूं और इसे AWS लाम्बा में अपलोड करता हूं, तो मुझे निम्नलिखित त्रुटि मिलती है:

{
    "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)"
    ]
}

मैंने अनगिनत लेखों को स्थापित किया और मॉड्यूल-जेएस, अनुरोध, और कई अन्य नोड मॉड्यूल स्थापित किए जो इस कोड को चलाने चाहिए, लेकिन इस मुद्दे को ठीक करने के लिए कुछ भी नहीं लगता है। यहाँ मेरी निर्देशिका है, बस मामले में:

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

क्या किसी को पता है कि मुद्दा क्या हो सकता है? अग्रिम में बहुत बहुत धन्यवाद।


यहाँ मेरे कोड के लिए लॉग आउटपुट है: 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
एंथनी क्रिवोनोस

3
एक मैक पर टर्मिनल का उपयोग कर ज़िपिंग पर जवाब के अलावा, यह भी सुनिश्चित करें कि आपके कोडफाइल को 'index.js' कहा जाता है। मेरा एक और वर्णनात्मक नाम था, त्रुटि उत्पन्न करना।
आर्ट

1
@ आर्ट यह मेरा मुद्दा था। मैंने एक परीक्षा ली। js और इसने एक अनहेल्ड एरर फेंक दिया। इसे index.js में बदलने के बाद इसने ठीक काम किया। धन्यवाद।
हडस्पेथ

जवाबों:


229

ठीक कर दिया! मेरा मुद्दा यह था कि मैंने फाइंडर में अपने मैक के अंतर्निहित संपीड़न फ़ंक्शन का उपयोग करके फ़ाइल को ज़िप करने की कोशिश की।

यदि आप Mac उपयोग कर रहे हैं, मेरे जैसे, आप टर्मिनल में निम्न स्क्रिप्ट जब आप (अपने वाले फ़ोल्डर अपनी परियोजना के रूट निर्देशिका में हैं चलाना चाहिए index.js, node_modulesआदि फ़ाइलें)।

zip -r ../yourfilename.zip *

विंडोज के लिए:

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

7
मैं ऐसा ज़िप कर रहा था: "ज़िप -r फ़ोल्डर folder.zip" और निश्चित रूप से यह विफल रहा। टिप के लिए सिर्फ फाइलों को ज़िप करने के लिए धन्यवाद और निर्देशिका नहीं
डेन मैकॉले

6
खिड़कियों के बारे में कैसे?
आलोक राजसुकुमारन

फ़ंक्शन का नाम भी सुनिश्चित करेंindex.js
ज्ञान

क्या निर्देशिका के बाहर से ऐसा करने का कोई तरीका है?
andrhamm

1
@ रणधाम हां। प्रारूप है zip -r /path/to/destination.zip /path/to/source/directory/*। यह निर्देशिका की सामग्री को ज़िप करता है। यदि आप निर्देशिका को स्वयं भी ज़िप करना चाहते हैं, तो * के बिना / पथ / से / स्रोत / निर्देशिका का उपयोग करें।
काज

23

स्वीकृत उत्तर पर अपडेट करें: जब यह त्रुटि होती है, तो इसका मतलब है कि आपकी ज़िप फ़ाइल वैध रूप में नहीं है, जिसे AWS की आवश्यकता है।

यदि आप ज़िप पर डबल क्लिक करते हैं, तो आपको अपना फ़ोल्डर उस कोड फ़ाइल के अंदर मिलेगा, लेकिन लैम्ब्डा चाहता है कि जब आप ज़िप पर डबल क्लिक करें तो यह डायरेक्ट कोड फ़ाइलों को दिखा दे।

इसे पाने के लिये:

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

फिर, index.zipAWS लाम्बा को अपलोड करें ।


विंडोज़ में गिट थ्रोइंग एरर "कमांड नहीं मिली", यह किसी भी विचार को कैसे हल किया जाए?
परदीप जैन

1
यह उबंटू की कमांड है, कृपया इसे विंडोज़ के लिए या कमांड प्रॉम्प्ट से जिप बनाने के लिए कैसे करें
आशुतोष झा

20

जाँचें कि फ़ाइल का नाम और हैंडलर नाम समान हैं:

इस स्थिति में हम यह उम्मीद करते हैं कि हमारा सारा कोड <code> bundle.ls </ code> फ़ाइल में होगा

इसका मतलब है कि zipफ़ाइल में bundle.jsफ़ाइल है जो handlerफ़ंक्शन निर्यात करती है:

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

4

मेरे मामले में ऐसा इसलिए था क्योंकि मेरे पास आंतरिक src निर्देशिका में हैंडलर फ़ाइल थी।

मुझे लैम्ब्डा के भीतर 'हैंडलर' संपत्ति को बदलना पड़ा:

index.handler

सेवा

src/index.handler

मैं भी इसमें भाग गया; [विंडोज] यह केवल इतना था कि मैं APIअपने रेपो और उपयोग के भाग पर सही क्लिक कर रहा था Send To > Compressed Folder। यह संरचना के साथ एक ज़िप बनाता है api/etc, इसलिए अपवाद!
सी बाउर

3

यह संभवतः आपके परिनियोजन ज़िप के अंदर फ़ाइलों के साथ अनुमतियाँ समस्या है। chmod 777ज़िप फ़ाइल में उन्हें पैक करने से पहले अपनी फ़ाइलों को आज़माएं ।


2
दुर्भाग्य से, यह समस्या को ठीक करने के लिए प्रतीत नहीं होता है। मैंने planyrबिना किसी लाभ के फ़ोल्डर को दूसरे फ़ोल्डर में संपीड़ित करने का प्रयास किया । मेरा हैंडलर नाम और मुख्य जावास्क्रिप्ट फ़ाइल नाम मैच ( index) है।
एंथनी क्रिवोनोस

chmod 777एक बुरी सलाह है ... यह लिखने, पढ़ने और निष्पादित करने के लिए जनता के लिए अनुमतियाँ खोल रहा है। कृपया हमेशा समस्या का मार्ग खोजें। हमेशा इंटरनेट में कोई भी व्यक्ति जो आपको बताता है, उसे क्रियान्वित करने के सुरक्षा निहितार्थ को समझने की कोशिश करें। सुरक्षा महत्वपूर्ण है और डिफ़ॉल्ट रूप से हमारे कोड में होनी चाहिए।
Exadra37

3

मेरे मामले में आर्काइव में index.js फ़ाइल के साथ एक फ़ोल्डर "src" था, इसलिए मुझे हैंडलर में रखना था: "src / index.handler"

यहाँ छवि विवरण दर्ज करें


0

मेरे मामले में मुझे प्रतिस्थापित करना था

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

साथ में

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

0

मुझे यह त्रुटि तब हुई जब मैं lambci/lambda:nodejs8.10विंडोज़ में उपयोग कर रहा था ।

मैंने ऊपर सूचीबद्ध सभी समाधानों की कोशिश की, लेकिन इनमें से कोई भी मेरे मुद्दे से निपटने में मदद नहीं कर सका (भले ही त्रुटि स्टैक प्रश्न के समान दिखे)।

यहाँ मेरा सरल समाधान है:

  1. --entrypointएक कंटेनर चलाने के लिए ध्वज का उपयोग करके यह पता लगाने के लिए कि क्या फ़ाइल कंटेनर में घुड़सवार है। यह पता चला है कि मुझे मेरे डॉकटर डेस्कटॉप के साथ शेयर ड्राइव का मुद्दा मिल सकता है।
  2. मैंने उस दिन पहले अपने डॉकटर डेमन को स्विच किया, लेकिन इस समस्या को छोड़कर सब कुछ ठीक है।
  3. वैसे भी, डॉकर डेस्कटॉप पर मेरी ड्राइव को रिमाउंट करें, आप दोनों dockerकमांड का उपयोग कर सकते हैं या आवेदन करने के लिए केवल डॉकर डेस्कटॉप सेटिंग खोल सकते हैं।

0

मेरे मामले में यह नोड मेमोरी से बाहर चलने के कारण हुआ था। मैंने तय किया कि --memory-size 1500मेरी aws lambda create-function ...आज्ञा को जोड़कर ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.