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

tap*_*ard 19 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');
Run Code Online (Sandbox Code Playgroud)

lambda控制台返回错误:

    {
      "errorMessage": "Cannot find module '../../geopoint'",
      "errorType": "Error",
      "stackTrace": []
    }
Run Code Online (Sandbox Code Playgroud)

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

e_m*_*ney 27

我认为你所经历的与我最近经历的一样.我可以在我的应用程序根目录中安装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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗨,谢谢你的答案,但我发现了另一种方式.在函数的s-functions.json中,我编辑了行"handler":"handler.handler"`到`"handler":"functions/geospatial/get_bounding_coordinates/handler.handler",`这样它就会设置函数root到节点模块的目录. (3认同)

Max*_*imi 7

对我来说最好的解决方案是无服务器插件:serverless-plugin-include-dependencies

无服务器插件包含依赖项


Mar*_*acz 6

您可以执行以下操作:

# serverless.yml
custom:
  webpack:
    includeModules:
      packagePath: '../package.json' # relative path to custom package.json file.
Run Code Online (Sandbox Code Playgroud)

参考文件