Twilio Functions中如何正确引入并使用自定义模块?
Twilio Functions 自定义公共模块引入方案
你遇到的Cannot find module报错核心原因是路径匹配错误:Twilio部署函数时,会把所有入口函数文件单独放到运行环境的/var/task/handlers/目录下,你写的./libs/utils.js是相对这个handlers目录寻址,但你本地创建的libs文件夹默认不会被打包到该路径下,自然无法找到对应模块。
可落地的实现方式
方式1:使用私有资产存放公共模块(控制台/CLI部署均适用)
这是官方推荐的跨函数复用代码的方案,步骤如下:
- 调整文件存放路径:把需要复用的JS文件放到项目的
assets目录下,如果要按libs目录分类,本地最终路径为assets/libs/utils.js - 加私有访问标记:把文件名改为
utils.js.private,加了.private后缀的资产不会暴露公网访问入口,仅能在函数运行时被内部调用 - 调整引入逻辑,不要直接写相对路径require,先通过Runtime API拿到文件的真实运行路径再加载:
const utilsPath = Runtime.getAssets()['/libs/utils.js'].path; const utils = require(utilsPath); exports.handler = async function(context, event, callback) { // 业务逻辑 utils.do_this(); callback(null, {success: true}); }
如果你直接在Twilio网页控制台操作、没有本地CLI环境,上传资产时直接在Assets板块上传文件,路径前缀填
/libs/utils.js,权限选择「Private」即可,不需要手动修改文件名后缀。
方式2:CLI部署时使用共享目录(仅适合本地用Serverless Toolkit部署的场景)
如果你用Twilio CLI做本地开发、部署函数,可以直接在项目根目录(和functions、assets文件夹平级)新建shared目录存放公共模块,引入时写从函数文件出发的相对路径即可。比如函数文件在functions/xxx.js,公共文件在shared/libs/utils.js,引入写法为:
const utils = require('../shared/libs/utils.js');
CLI部署时会自动把shared目录打包到运行环境的正确路径下,不会出现模块找不到的问题。
原写法的问题
直接写require('./libs/utils.js')默认从当前函数文件所在目录查找libs文件夹,但Twilio不会把根目录下自建的libs文件夹同步到handlers目录,除非你把libs文件夹直接放到每个函数文件所在的functions子目录下——但这种写法需要在每个函数目录下存一份公共代码,维护成本极高,不推荐使用。
内容的提问来源于stack exchange,提问作者WilliamX
相关产品推荐
相关产品推荐

