2016-10-15 124 views
0

我试图让casperjs使用我的AWS Lambda函数。CasperJS和AWS Lambda

{ 
"errorMessage": "Cannot find module 'casper'", 
"errorType": "Error", 
"stackTrace": [ 
"Function.Module._load (module.js:276:25)", 
"Module.require (module.js:353:17)", 
"require (internal/module.js:12:17)", 
"Object.<anonymous> (/var/task/index.js:3:14)", 
"Module._compile (module.js:409:26)", 
"Object.Module._extensions..js (module.js:416:10)", 
"Module.load (module.js:343:32)", 
"Function.Module._load (module.js:300:12)", 
"Module.require (module.js:353:17)" 
] 
} 

在Lambda无法检测到casperjs的情况下,我不断收到此错误。我将zip文件上传到Lambda,并在将文件压缩之前将casperjs模块安装到我的目录中。

我的package.json文件说我安装了casperjs。

{ 
"name": "lambda", 
"version": "1.0.0", 
"description": "", 
"main": "index.js", 
"scripts": { 
"test": "echo \"Error: no test specified\" && exit 1" 
}, 
"keywords": [], 
"author": "", 
"license": "ISC", 
"dependencies": { 
"casperjs": "^1.1.3", 
} 
} 

有人会知道我在做什么错吗?谢谢。

回答

3

由于CasperJs依靠PhantomJs,你可以非常类似于将它设置为这个回购:https://github.com/TylerPachal/lambda-node-phantom

主要区别在于您需要添加和定位CasperJs,您需要确保CasperJs能够找到并加载PhantomJs。

  1. 在您的软件包目录中创建一个node_modules目录。

  2. 添加依赖于CasperJs到packages.json文件:

    "dependencies": { 
        "casperjs": "latest" 
    } 
    
  3. 在终端,导航到你的包目录并运行“NPM更新”到CasperJs包添加到node_modules目录。

  4. 假设要运行的“测试”的说法CasperJs,该index.js文件需要被改成这个样子:

    var childProcess = require('child_process'); 
    var path = require('path'); 
    
    exports.handler = function(event, context) { 
    
        // Set the path as described here: https://aws.amazon.com/blogs/compute/running-executables-in-aws-lambda/ 
        process.env['PATH'] = process.env['PATH'] + ':' + process.env['LAMBDA_TASK_ROOT']; 
    
        // Set the path to casperjs 
        var casperPath = path.join(__dirname, 'node_modules/casperjs/bin/casperjs'); 
    
        // Arguments for the casper script 
        var processArgs = [ 
         'test', 
         path.join(__dirname, 'casper_test_file.js') 
        ]; 
    
        // Launch the child process 
        childProcess.execFile(casperPath, processArgs, function(error, stdout, stderr) { 
         if (error) { 
          context.fail(error); 
          return; 
         } 
         if (stderr) { 
          context.fail(error); 
          return; 
         } 
         context.succeed(stdout); 
        }); 
    } 
    

    如果你不想跑CasperJs与'测试'参数,只是从参数列表中删除它。

  5. 您的包根目录中的PhantomJs二进制文件需要重命名为phantomjs,以便CasperJs可以找到它。如果您想要获得PhantomJs的新版本,您可以在此处获得:。确保下载一个linux-x86_64.tar.bz2类型,以便它可以在Lambda中运行。下载之后,只需将一个新的二进制文件从bin目录中取出并放入根目录包目录即可。

  6. 为了让Lambda有权限访问所有文件,最简单的方法是在Unix类操作系统中压缩包。确保包中的所有文件都具有读取和执行权限。从包目录内:chmod -R o+rx *。然后将其压缩:zip -r my_package.zip *

  7. 将压缩包上传到您的Lambda函数。

+0

这很好用,但我必须将phantomjs固定为1.9.8 - 最近的版本会在Lambda上失败。 – awendt

1

根据Casper.js Docs,它不是一个实际的Node模块。所以你不能在Package.json中使用它,并用节点模块压缩它。您将需要找到如何将它安装在lambda实例上,或者找到一个实际的节点模块来执行您想要的操作。我怀疑在lambda上安装casper可能是不可能的,但那只是我的直觉。

警告 尽管CasperJS可通过npm进行安装,但它不是NodeJS模块,并且不适用于开箱即用的NodeJS。您不能通过在节点中使用require('casperjs')来加载casper。请注意,CasperJS无法使用绝大多数的NodeJS模块。试验并使用你最好的判断。

http://docs.casperjs.org/en/latest/installation.html