Node.js Alexa Task Issue
現在、AWS Lambdaを介してNode.js Alexaタスクをコーディングしています。OpenWeatherAPIから情報を受け取り、それを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や他のIDEで何度も実行しましたが、問題なく動作しているようです。ただし、Zipをパッケージに圧縮してAWS Lambdaにアップロードすると、次のエラーが表示されます。
{
"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)"
]
}
私は数え切れないほどの記事を精査し、module-js、request、およびこのコードを実行する他の多くのNodeモジュールをインストールしましたが、この問題を解決するものは何もありません。念のため、ここに私のディレクトリを示します。
- planyr.Zip
- index.js
- node_modules
- package.json
誰が問題が何であるかを知っていますか?よろしくお願いします。
それを修正しました!私の問題は、FinderでMacに組み込まれている圧縮機能を使用してファイルを圧縮しようとしたことです。
私のようなMacユーザーの場合、プロジェクトのルートディレクトリ(index.js
、node_modules
などのファイルを含むフォルダー)にいるときに、ターミナルで次のスクリプトを実行する必要があります。
Zip -r ../yourfilename.Zip *
Windowsの場合:
Compress-Archive -LiteralPath node_modules, index.js -DestinationPath yourfilename.Zip
受け入れられた回答の更新:このエラーが発生した場合、ZipファイルがAWSが必要とする有効な形式ではないことを意味します。
Zipをダブルクリックすると、コードファイル内にフォルダーがありますが、lambdaは、Zipをダブルクリックすると直接コードファイルが表示されることを望んでいます
これを達成するには:
open terminal
cd your-lambda-folder
Zip -r index.Zip *
次に、index.Zip
をAWS Lambdaにアップロードします。
これはおそらく、展開Zip内のファイルに関する権限の問題です。 Zipファイルにパッケージ化する前に、ファイルをchmod 777
試してください。
私の場合は、内部のsrcディレクトリにハンドラーファイルがあるためです。
Lambda内の「Handler」プロパティを以下から変更する必要がありました。
index.handler
に
src/index.handler
Windowsでlambci/lambda:nodejs8.10
を使用していたときにこのエラーが発生しました。
上記のすべての解決策を試しましたが、どれも問題に対処するのに役立ちませんでした(エラースタックが質問と同じに見えても)。
これが私の簡単な解決策です。
--entrypoint
フラグを使用してコンテナを実行し、ファイルがコンテナにマウントされているかどうかを確認します。 Docker Desktopで共有ドライブの問題が発生する可能性があります。docker
コマンドを使用するか、Docker Desktopの設定を開いて適用するだけです。私の場合、私は交換しなければなりませんでした
exports.handler = function eventHandler (event, context) {
と
exports.handler = function (event, context, callback) {