【问题标题】:Serverless Node.js Project Structure无服务器 Node.js 项目结构
【发布时间】:2017-11-04 07:22:15
【问题描述】:

我正在使用无服务器框架构建一个 RESTful API,以在 AWS 上运行(API Gateway + Lambda + DynamoDB)。这是我的第一个 Node 项目和我的第一个无服务器生产项目,我不知道如何构建它。到目前为止,我有以下 |--Functions |-----Function1 |--------InternalModule |-----Function2 |-----Function3 |--------InternalModule |-----Function4 |--Shared |-----Module1 |-----Module2 |-----Module3 |--Tests |-----Functions |--------Function1 |-----------InternalModule |--------Function2 |-----------InternalModule |--------Function3 |-----------InternalModule |--------Function4 |-----------InternalModule |-----Modules |--------Module1 |-----------InternalModule |--------Module2 |-----------InternalModule |--------Module3 |-----------InternalModule 我将 API 端点(Lambda 处理程序)保存在 Functions 中。他们中的一些人有他们只使用的内部模块,还有一些人使用来自 Shared 的模块。我想对我的所有模块进行单元测试——内部和共享以及对 lambda 函数的 API 测试。我正在使用 mocha 和 chai 并希望将所有内容集成到管道中,该管道在 git push 上运行 linter 和测试,如果它们成功将 API 部署到适当的阶段。问题是,为了测试每个模块,我必须在我有测试文件的每个文件夹中将 chai 作为本地节点模块,并通过相对路径引用要测试的模块。在大多数情况下,由于嵌套,它看起来非常难看。如果我想测试一个内部模块 Tests/Functions/Function1/InternalModule 我要求它像这样在测试之上 require('../../../../Tests/Functions/Function1/InternalModule') + 我必须在每个文件夹中安装 chai 以便可以访问。 mocha 和测试所需的所有依赖项也是如此,我什至没有提到配置。我现在考虑的主要想法是天气与否我应该将所有模块带到一个名为 modules 的文件夹中,并在需要时需要它们 - 最坏的情况 from Functions/Function1 require('../../Modules/Module1') 还将测试文件保存在模块文件夹中并在其中运行它们,但这需要在每个文件夹中安装断言库。我已经阅读了有关 npm 链接和符号链接的信息,但我想跟踪每个文件夹具有哪些依赖项,以便在从无法执行链接的 GitHub 下载干净项目后将它们安装在 CI 环境中(或者我已经整个概念错了吗?)

如果有人能提出更好的解决方案,我将不胜感激!

【问题讨论】:

    标签: node.js unit-testing tdd mocha.js serverless-framework


    【解决方案1】:

    Node 使用 require 的方式比我想象的要多得多!

    首先,Node.js 查看给定模块是否是核心模块 - Node.js 带有许多直接编译成可执行二进制文件的模块(例如 http、fs、sys、事件、路径等)。这些核心模块在加载算法中总是优先。

    如果给定模块不是核心模块,Node.js 将开始搜索名为“node_modules”的目录。它将从当前目录开始(相对于 Node 中当前正在执行的 Javascript 文件),然后沿着文件夹层次结构向上移动,检查每个级别的 node_modules 文件夹。

    read more here

    我将尝试将所有模块放在一个单独的文件夹中,每个模块都有自己的文件夹,前缀为 FunctionName_,这样我就知道每个模块的使用位置,以及测试文件 + package.json 文件。然后,如果我需要一个模块,我可以从看起来不错的浅嵌套函数中请求它:

    from Functions/Function1
    
    require('module-1');
    

    使用 package.json

    "dependencies":{
        "module-1":"file:../../Modules/Function1_Module1"
    }
    

    并有一个单独的文件夹 Shared 用于保存共享模块。 我仍然愿意接受更好的想法!

    【讨论】:

      猜你喜欢
      • 2018-01-12
      • 2018-01-28
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多