无服务器框架:如何添加外部NPM包?

时间:2016-05-11 17:20:44

标签: node.js aws-lambda serverless-framework

我的情况是我在向我的无服务器框架项目添加外部NPM包时遇到了一些麻烦(特定包是geopoint)。

我转到了无服务器项目的根文件夹并运行了npm install geopoint --save。 package.json更新了dependencies": { "geopoint": "^1.0.1" }并创建了node_modules文件夹。

我的文件夹结构如下所示:
根项目文件夹
-functions
--geospatial
--- handler.js
-node_modules
--geopoint

在我的函数/ geospatial / handler.js中,我使用:

声明了geopoint模块
    var geopoint = require('geopoint');
    var geopoint = require('../../geopoint');
    var geopoint = require('../../../geopoint');

lambda控制台返回错误:

    {
      "errorMessage": "Cannot find module '../../geopoint'",
      "errorType": "Error",
      "stackTrace": []
    }

如何正确地将外部NPM模块添加到无服务器框架项目?

3 个答案:

答案 0 :(得分:24)

我认为您遇到的情况与我最近遇到的情况相同。我可以在我的应用程序根目录中安装npm软件包,但什么都不会部署到lambda。

我的理解是无服务器在每个组件目录(应用程序根目录下的子目录)下部署所有内容。在您的情况下,在functions

我在无服务器文档中找不到多少,但我所做的是在我的package.json文件夹下定义一个functions文件,然后在该子目录中运行npm install。然后在部署到lambda之后,此目录下的node_modules也被部署,这意味着我的功能代码可能需要任何这些npm模块。

因此,您的文件夹结构现在应如下所示:

root-project-folder
|-functions
|--package.json
|--node_modules
|---geopoint
|--geospatial
|---handler.js
|-package.json
|-node_modules
|--geopoint

此处的好处是,您只能部署您的功能所需的npm依赖项,而无需无服务器部署资源所需的那些。

希望这有助于 - 再一次,不确定这是最佳做法,也就是我所做的事情,因为我没有记录在无服务器存储库或任何示例代码中的任何地方。

答案 1 :(得分:1)

对我来说,最好的解决方案是无服务器插件:无服务器插件 - 包含依赖性

serverless-plugin-include-dependencies

答案 2 :(得分:0)

您可以执行以下操作:

# serverless.yml
custom:
  webpack:
    includeModules:
      packagePath: '../package.json' # relative path to custom package.json file.

Reference document