aws lambda nodejs - 上传由GULP压缩的zip文件时出错

时间:2016-10-25 05:06:43

标签: gulp aws-lambda

我使用Gulp压缩zip文件,然后将其上传到AWS Lambda。上传zip文件是手动完成的。只有压缩过程由Gulp处理。

这是我的gulpfile.js

mongo.db

运行部署任务后,将创建名为dist.zip的zip文件夹,其中包含index.js文件和node_modules文件夹。 node_modules文件夹只包含一个lodash库。

这是index.js

var gulp = require('gulp');
var zip = require('gulp-zip');
var del = require('del');
var install = require('gulp-install');
var runSequence = require('run-sequence');
var awsLambda = require("node-aws-lambda");

gulp.task('clean', function() {
  return del(['./dist', './dist.zip']);
});

gulp.task('js', function() {
  return gulp.src('index.js')
    .pipe(gulp.dest('dist/'));
});

gulp.task('npm', function() {
  return gulp.src('./package.json')
    .pipe(gulp.dest('dist/'))
    .pipe(install({production: true}));
});

gulp.task('zip', function() {
  return gulp.src(['dist/**/*', '!dist/package.json'])
    .pipe(zip('dist.zip'))
    .pipe(gulp.dest('./'));
});

gulp.task('deploy', function(callback) {
  return runSequence(
    ['clean'],
    ['js', 'npm'],
    ['zip'],
    callback
  );
});

使用AWS lambda控制台上传dist.zip文件夹后。显示无法找到lodash库的错误

var _ = require('lodash');

console.log('Loading function');

exports.handler = (event, context, callback) => {
    //console.log('Received event:', JSON.stringify(event, null, 2));


    var b = _.chunk(['a', 'b', 'c', 'd', 'e'], 3);
    console.log(b);

    callback(null, event.key1);  // Echo back the first key value
    //callback('Something went wrong');
};

但是在zip文件夹中,有一个包含lodash lib的node_modules目录。

{
  "errorMessage": "Cannot find module 'lodash'",
  "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:1:71)",
    "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)"
  ]
}

当我手动压缩node_modules目录和文件index.js时,它可以正常工作。

有谁知道什么是错的?也许在使用Gulp进行压缩时,lib路径配置错误了?

2 个答案:

答案 0 :(得分:5)

几天前我遇到了同样的问题 每个人都指着gulp zip,但gulp zip没问题。

以下工作正常:

gulp
    .src(['sourceDir/**'],         {nodir: true, dot: true}  )
    .pipe(zip('target.zip'))
    .pipe(gulp.dest('build/'));

也就是说,请注意以下内容,在src的第二个参数中,在上面:

{nodir: true, dot: true}

也就是说,我们必须为zip包含点文件(例如:.config,.abc等) 所以,在gulp的.src中包含上述内容,否则其他所有内容如copy,zip等都将是不正确的。

答案 1 :(得分:1)

gulp-zip包大受欢迎(每天下载4.3k),似乎没有任何Gulp替代品。问题肯定在于相对路径以及gulp-zip如何处理它们。 即使在gulp.src函数中使用基本路径选项(例如下面的例子),gulp-zip也会找到一种方法来搞乱它。

gulp.task("default", ["build-pre-zip"], function () {
  return gulp.src([
  "dist/**/*"
  ], { base: "dist/" })
  .pipe(debug())
  .pipe(zip("dist.zip"))
  .pipe(gulp.dest("./dist/"));
});

由于截至2017年1月4日没有良好的Gulp解决方案,我建议进行解决。我先使用Gulp填充dist文件夹,确切地说我需要使用正确的node_modules夹。然后是时候用存储的相对文件路径正确压缩dist文件夹了。为了做到这一点并且还更新Lambda,我使用命令行选项的批处理文件(Windows)来完成工作。这是我创建的upload.bat文件,取代了gulp-zip任务:

start /wait cmd /c "gulp default"
start /wait cmd /c "C:\Program Files\WinRAR\WinRAR.exe" a -r -ep1 dist\dist.zip dist\*.*
aws lambda update-function-code --zip-file fileb://dist/dist.zip --function-name your-fn-name-here

如果您使用WinRAR,您将find their command line docs here,对于WinZip go here.该.bat文件假定您使用的是AWS命令行界面(CLI),这是一个天赐之物; get it here.

如果您希望这个答案指向100%Gulp解决方案,我说,&#34;您和我两个人!&#34; 。祝你好运。