【问题标题】:CasperJS and AWS LambdaCasperJS 和 AWS Lambda
【发布时间】:2016-12-06 03:17:19
【问题描述】:

我正在尝试让 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",
} 
}

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

【问题讨论】:

    标签: amazon-web-services casperjs aws-lambda


    【解决方案1】:

    由于 CasperJs 依赖于 PhantomJs,因此您可以将其设置为与此 repo 非常相似:https://github.com/TylerPachal/lambda-node-phantom

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

    1. 在你的包目录中创建一个 node_modules 目录。

    2. 将 CasperJs 的依赖项添加到 packages.json 文件中:

      "dependencies": {
          "casperjs": "latest"
      }
      
    3. 在终端中,导航到您的包目录并运行“npm update”以将 CasperJs 包添加到 node_modules 目录。

    4. 假设您想使用“test”参数运行 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);
          });
      }
      

      如果您不想使用“test”参数运行 CasperJs,只需将其从参数列表中删除即可。

    5. 你的包根目录下的 PhantomJs 二进制文件需要重命名为 phantomjs,这样 CasperJs 才能找到它。如果您想获得新版本的 PhantomJs,可以在这里获得:https://bitbucket.org/ariya/phantomjs/downloads。确保下载 linux-x86_64.tar.bz2 类型,以便它可以在 Lambda 中运行。下载后,只需从 bin 目录中拉出一个新的二进制文件并将其放在根包目录中。

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

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

    【讨论】:

    • 这很好用,但我不得不将 phantomjs 固定到 1.9.8 - 更新的版本在 Lambda 上会失败。
    【解决方案2】:

    根据 Casper.js Docs,它实际上并不是一个 Node Module。因此,您不能在 Package.json 中要求它并将其与节点模块一起压缩。您将需要找到如何在 lambda 实例上安装它或找到一个实际的节点模块来满足您的需求。我怀疑在 lambda 上安装 casper 可能是不可能的,但这只是我的直觉。

    警告 虽然 CasperJS 可以通过 npm 安装,但它不是 NodeJS 模块,并且不能与 NodeJS 一起使用。你不能通过在 node.js 中使用 require('casperjs') 来加载 casper。请注意,CasperJS 无法使用绝大多数 NodeJS 模块。试验并运用您的最佳判断。

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

    【讨论】:

    • 我们有可能使用它
    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2017-11-04
    • 2018-03-08
    • 2016-06-23
    • 2020-04-20
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多