Javascript 为什么在exports.handler中包装Lambda时会出现此代码错误?
我正在使用这个casperjs nodejs应用程序: 我已经让我的代码在本地和上传到Lambda时工作,但是我需要将我的代码包装在exports.handler中,这样我就可以从API网关向函数传递数据。(我已经对其他不使用此应用程序的函数执行了此操作。)当我将代码放入exports.handler中时,它失败。我已经测试过将事件数据添加到lambda内部的测试事件中,并尝试对其进行硬编码。当我的代码在exports.handler中时,两者都会失败。为什么exports.handler会破坏此代码 不带exports.handler的工作代码:Javascript 为什么在exports.handler中包装Lambda时会出现此代码错误?,javascript,node.js,amazon-web-services,aws-lambda,aws-api-gateway,Javascript,Node.js,Amazon Web Services,Aws Lambda,Aws Api Gateway,我正在使用这个casperjs nodejs应用程序: 我已经让我的代码在本地和上传到Lambda时工作,但是我需要将我的代码包装在exports.handler中,这样我就可以从API网关向函数传递数据。(我已经对其他不使用此应用程序的函数执行了此操作。)当我将代码放入exports.handler中时,它失败。我已经测试过将事件数据添加到lambda内部的测试事件中,并尝试对其进行硬编码。当我的代码在exports.handler中时,两者都会失败。为什么exports.handler会破坏
var ua = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
var casper = require('casper').create({
viewportSize: {width: 768, height: 1024},
userAgent: ua
});
var login = {email: 'fakeemail@gmail.com', pw: 'fakepw'}
var usrObj = {
succ: {},
err: []
};
//exit function
function exit() {
setTimeout(function() {
casper.exit();
casper.bypass(1);
}, 10);
}
//success & error message function
function message(dat) {
if (dat === 'credentials') {
console.log('Error: Login credentials are missing');
return exit();
}
else if (dat) {
console.log(dat);
return exit();
}
if (usrObj['err'].length > 0) {
console.log('Error not empty...');
console.log(usrObj.err);
return exit();
}
else if (usrObj['succ']) {
console.log('Success not empty...');
console.log(JSON.stringify(usrObj.succ));
return exit();
}
}
//trim login credentials
login.email = login.email.trim();
login.pw = login.pw.trim();
if (login.email && login.pw) {
casper.start('https://vimeo.com/log_in');
casper.waitForSelector('form#login_form',
function success() {
this.echo(this.getCurrentUrl());
this.sendKeys('form#login_form input[name="email"]', login.email);
this.sendKeys('form#login_form input[name="password"]', login.pw);
this.click('form#login_form input[type=submit][value="Log in with email"]');
},
function fail() {
message('Error with Vimeo [page not loading]')
}
);
casper.waitForSelector('#page_header>h1>a',
function success() {
this.echo(this.getCurrentUrl());
usrObj['succ']['uname'] = this.getHTML('span.topnav_user_name');
usrObj['succ']['profile'] = this.getElementAttribute('li.topnav_user_profile>a', 'href');
var test = [];
if (!usrObj.succ.uname) {test.push('Username not retrieved')}
if (!usrObj.succ.profile) {test.push('Profile link not retrieved')}
if (test.length > 0) {message(test.join('<br />'));}
//else {message();}
},
function fail() {
message('Login not successful');
}
);
casper.thenOpen('https://vimeo.com/staceydavidgearz',
function success() {
this.echo('Stacey David Profile: ' + this.getTitle());
this.echo(this.getCurrentUrl());
var finish = function() {
usrObj['succ']['foll'] = true;
message();
}
//var foll = this.getHTML('button[data-fatal-attraction="container:profile_page|component:follow"] > span');
var foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
this.click('button[data-fatal-attraction="container:profile_page|component:follow"]');
setTimeout(function() {
foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
message('Can\'t follow SD');
}
else {finish();}
}, 250);
}
else {
finish();
}
},
function fail() {
message('Not going to Stacey David profile page.');
}
);
casper.run();
}
else {message('credentials');}
var ua = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1';
var casper = require('casper').create({
viewportSize: {width: 768, height: 1024},
userAgent: ua//,
//verbose: true,
//logLevel: 'debug'
});
exports.handler = function (event, context) {
var login = {};
var usrObj = {
succ: {},
err: []
};
//exit function
var exit = function() {
setTimeout(function() {
casper.page.close();
casper.exit();
casper.bypass(1);
}, 10);
};
//success & error message function
var message = function(dat) {
if (dat === 'credentials') {
usrObj['err'].push('Error: Login credentials are missing');
}
else if (dat) {
usrObj['err'].push(dat);
}
if (usrObj['err'].length > 0) {
console.log('Error not empty...');
console.log(JSON.stringify(usrObj.err));
context.fail(JSON.stringify(usrObj.err));
return exit();
}
else if (usrObj['succ']) {
console.log('Success not empty...');
console.log(JSON.stringify(usrObj.succ));
context.succeed(JSON.stringify(usrObj.succ));
return exit();
}
};
//trim login credentials
login.email = event.email;
login.pw = event.pw;
if (login.email && login.pw) {
casper.start('https://vimeo.com/log_in');
casper.waitForSelector('form#login_form',
function success() {
this.echo(this.getCurrentUrl());
this.sendKeys('form#login_form input[name="email"]', login.email);
this.sendKeys('form#login_form input[name="password"]', login.pw);
this.click('form#login_form input[type=submit][value="Log in with email"]');
},
function fail() {
message('Error with Vimeo [page not loading]')
}
);
casper.waitForSelector('#page_header>h1>a',
function success() {
this.echo(this.getCurrentUrl());
usrObj['succ']['uname'] = this.getHTML('span.topnav_user_name');
usrObj['succ']['profile'] = this.getElementAttribute('li.topnav_user_profile>a', 'href');
var test = [];
if (!usrObj.succ.uname) {test.push('Username not retrieved')}
if (!usrObj.succ.profile) {test.push('Profile link not retrieved')}
if (test.length > 0) {message(test.join('<br />'));}
//else {message();}
},
function fail() {
message('Login not successful');
}
);
casper.thenOpen('https://vimeo.com/staceydavidgearz',
function success() {
this.echo('Stacey David Profile: ' + this.getTitle());
this.echo(this.getCurrentUrl());
var finish = function() {
usrObj['succ']['foll'] = true;
message();
}
var foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
this.click('button[data-fatal-attraction="container:profile_page|component:follow"]');
setTimeout(function() {
foll = this.getElementAttribute('button[data-fatal-attraction="container:profile_page|component:follow"] > svg', 'viewBox');
if (foll === '0 0 10 10') {
message('Can\'t follow SD');
}
else {finish();}
}, 250);
}
else {
finish();
}
},
function fail() {
message('Not going to Stacey David profile page.');
}
);
casper.run();
}
else {message('credentials');}
};
日志:
确保您还使用casper组件上载依赖项“节点\模块”。 给出该错误是因为在lambda执行中未在require中找到该组件。请遵循以下链接: 您好,您可以通过casper args支持将数据传递到scraper脚本: 对index.js文件中的runCasper函数进行如下更改:
var childArgs = [
path.join(__dirname, scriptName),
***@***.***',
'--password=12345'
];
在casper脚本中,可以得到如下参数数据
下:
希望这有帮助
干杯
Narain该应用程序可压缩并上传所有依赖项。正如我所说,当我没有将代码封装在exports.handler中时,它就工作了,所以我不认为这是一个依赖性问题。这是一个想法,但我认为casper.js试图在“/var/task/phantomjs”中调用“从这里安装”的可执行文件,因此,即使在lambda执行中增加所有依赖项,也不会在lamba容器中发现安装了这样的可执行文件,并显示错误整个日志:
START RequestId:963d81c2-ef0f-11e6-9512-b12f2c1aac99版本:$LATEST 2017-02-09T21:34:51.289Z 963d81c2-ef0f-11e6-9512-b12f2c1aac99调用casperJS:/var/task/node_modules/casperjs/bin/casperjs['/var/task/casperjs script.js']{PHANTOMJS_可执行文件:'/var/task/PHANTOMJS'}2017-02-09T21:34:52.513Z 963d81c2-ef0f-11e6-9512-b12f2c1aac99子进程已退出,代码为1结束请求ID:963d81c2-ef0f-11e6-9512-b12f2c1aac99报告请求ID:963d81c2-ef0f-11e6-9512-b12f2c1aac99持续时间:1247.28毫秒计费持续时间:1300毫秒内存大小:256 MB最大使用内存:43 MB我把exports.handler改为casper.handler,直到超时为止。之前,我几乎是立即得到上面的日志。我在挖掘这个应用程序的index.js文件后发现了什么。
Calling casperJS: /var/task/node_modules/casperjs/bin/casperjs [ '/var/task/casperjs-script.js' ] { PHANTOMJS_EXECUTABLE: '/var/task/phantomjs' }
child process exited with code 1
var childArgs = [
path.join(__dirname, scriptName),
***@***.***',
'--password=12345'
];
var utils = require('utils');
utils.dump(casper.cli.get('email'));
utils.dump(casper.cli.get('password'));
// OR
// utils.dump(casper.cli.raw.get('email'));
// utils.dump(casper.cli.raw.get('password'));