我正在研究一个使用模块的lambda(异步,请求等)
Unable to import module 'index': Error at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) at Module.require (module.js:364:17) at require (module.js:380:17) at Object.<anonymous> (/var/task/index.js:1:63) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17)
示例代码:
var AWS = require('aws-sdk'),util = require('util'),request = require('request'); exports.handler = function(event,context) { console.log('test'); context.done(); };
只要不需要第三方模块(除了aws-sdk),它工作正常(打印测试).只要我添加一行如下:
require('request') // or async,config and so on
它失败并出现上述错误.我已经尝试直接调用这些模块,通过指定没有运气的完整路径.就像在调用require时查看错误的目录一样.
在控制台中转储process.env产生:
PATH: '/usr/local/bin:/usr/bin:/bin',LAMBDA_TASK_ROOT: '/var/task',LAMBDA_RUNTIME_DIR: '/var/runtime',AWS_REGION: 'us-west-2',AWS_DEFAULT_REGION: 'us-west-2',AWS_LAMBDA_LOG_GROUP_NAME: '/aws/lambda/Thumbnailer',AWS_LAMBDA_LOG_STREAM_NAME: '2015/12/10/[$LATEST]3f8ef236195448c88f206634bde6301b',AWS_LAMBDA_FUNCTION_NAME: 'Thumbnailer',AWS_LAMBDA_FUNCTION_MEMORY_SIZE: '512',AWS_LAMBDA_FUNCTION_VERSION: '$LATEST',NODE_PATH: '/var/runtime:/var/task:/var/runtime/node_modules',
这是我工作的module – 显然这曾经在某些时候起作用但不适合我.
想法?我觉得我在这里缺少一些lambdas特有的配置.
解决方法
omg这很痛苦……原来OSX使node_modules文件夹只能由用户读取,AWS无法读取它.使node_modules文件夹和内容可以被世界读取并且它可以工作.我不确定所有OSX设置是否反应相同.我正在使用可能是罪魁祸首的nvm.
更新.我曾经将所有文件设置为0666,但遇到了可执行文件的问题.这是一个可以正确解决问题的小脚本.它会将所有文件设置为0666,除非可执行文件或目录在这种情况下为0777.在项目文件夹中运行它(请注意不这样做的含义!):
这是我发布的question的脚本:
#!/bin/bash find . \ '(' -perm -0700 -exec chmod 0777 '{}' + ')' -o \ '(' -perm -0600 -exec chmod 0666 '{}' + ')'