Node.js 在firebase中动态导出函数

Node.js 在firebase中动态导出函数,node.js,typescript,firebase,google-cloud-functions,firebase-cli,Node.js,Typescript,Firebase,Google Cloud Functions,Firebase Cli,我在云函数中遇到了典型的冷启动时间问题(根据许多帖子)。一个似乎承诺的解决方案建议只导入/导出实际执行的函数,如下所示: 这是一个Javascript示例,但我使用的是typescript。我已经尝试了许多变体,虽然进行了一些构建,但最终我总是坚持不导出我的函数,并部署警告我将删除现有函数 这是众多尝试之一: if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'generateInviteURL') { impo

我在云函数中遇到了典型的冷启动时间问题(根据许多帖子)。一个似乎承诺的解决方案建议只导入/导出实际执行的函数,如下所示:

这是一个Javascript示例,但我使用的是typescript。我已经尝试了许多变体,虽然进行了一些构建,但最终我总是坚持不导出我的函数,并部署警告我将删除现有函数

这是众多尝试之一:

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'generateInviteURL') {
  import ('./invite_functions').then ((mod) => { console.log ("mod follows" ); console.log (mod);  exports.generateInviteURL = functions.https.onRequest( mod.generateInviteURL ); } )
  .catch ((err) => {console.log ("Trying to import/export generateInviteURL ", err);}) ;
}
如上所述,在部署时发生的情况是,我收到一条关于函数被删除的警告

我可以通过这样的方式“避免”这个信息:

console.log ("Function name: ", process.env.FUNCTION_NAME);

function dummy_generateInviteURL (req, res) { ; }
exports.generateInviteURL = functions.https.onRequest( dummy_generateInviteURL );

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'generateInviteURL') {
console.log ("Doing the good import");
import ('./invite_functions').then ((mod) => { console.log ("mod follows" ); console.log (mod);  exports.generateInviteURL = functions.https.onRequest( mod.generateInviteURL ); } )
  .catch ((err) => {console.log ("Trying to import/export generateInviteURL ", err);}) ;
}

console.log ("Exported");
console.log (exports.generateInviteURL);
generateInviteURL Function name:  generateInviteURL generateInviteURL  
generateInviteURL Exported generateInviteURL
{ [Function: cloudFunction] __trigger: { httpsTrigger: {} } }
当然,这个想法是,一个空函数总是会被导出,但如果被调用的是真实函数,它就会被替换

在这种情况下,日志如下所示:

console.log ("Function name: ", process.env.FUNCTION_NAME);

function dummy_generateInviteURL (req, res) { ; }
exports.generateInviteURL = functions.https.onRequest( dummy_generateInviteURL );

if (!process.env.FUNCTION_NAME || process.env.FUNCTION_NAME === 'generateInviteURL') {
console.log ("Doing the good import");
import ('./invite_functions').then ((mod) => { console.log ("mod follows" ); console.log (mod);  exports.generateInviteURL = functions.https.onRequest( mod.generateInviteURL ); } )
  .catch ((err) => {console.log ("Trying to import/export generateInviteURL ", err);}) ;
}

console.log ("Exported");
console.log (exports.generateInviteURL);
generateInviteURL Function name:  generateInviteURL generateInviteURL  
generateInviteURL Exported generateInviteURL
{ [Function: cloudFunction] __trigger: { httpsTrigger: {} } }
因此,第一部分看起来很有希望(定义了环境变量),然后导入做了一些事情(进入then块,而不是catch),但导出的变量没有被替换

我不确定这是一个类型脚本问题,一个firebase问题,还是一个开发人员问题——可能我只是错过了一些明显的东西


因此,问题是——如何避免导入/导出每个特定函数不需要的任何内容?

您可以坚持使用原始index.js,只需稍作修改。我试了几次,找到了解决办法。Am包括一个示例dir结构和两个typescript文件(index.ts和另一个用于自定义函数)。这样,您就不必更改index.ts来修改或添加函数

目录结构 src/index.ts 创建上述文件后,请安装npm软件包“glob”和“camelcase”, 然后尝试部署firebase函数

Firebase将部署名为“getStatus”的函数

注意该函数的名称是文件夹名称的驼峰大小写版本和该函数存在的文件名,因此每个.f.ts文件只能导出一个函数

编辑
我已经更新了dir结构。请注意index.ts和所有后续文件和文件夹都位于父文件夹“src”中

我也遇到过类似的问题,我编写了一个非常酷的解决方案

我决定把它作为一个开源软件包发布——我以前从来没有这样做过,所以如果有人可以查看它,贡献或提供反馈,那就太好了

该软件包名为
better firebase functions
-

您所要做的就是导入并运行它。两行。几乎所有其他事情都是自动化的

它将获取目录中所有函数文件的默认导出,并将它们作为正确命名的函数进行部署。 以下是一个例子:

从“更好的firebase函数”导入{exportFunctions};
输出函数({
__filename,//标准节点变量(保持原样)。
导出,//标准节点变量(保持原样)。
functionDirectoryPath:“./myFuncs”,//定义根函数文件夹
//相对于此文件。
searchGlob:'***.js'//文件搜索glob模式。
});
您需要做的另一件事是将
函数.http.onRequest()…
作为默认导出,从包含要部署的云函数的每个文件导出。因此:

export default functions.http.onRequest()...
/// OR
const func1 = functions.http.onRequest()...
export default func1;
就这样!
更新:答案经过编辑以反映更新版本的软件包。

所有JavaScript都是有效的TypeScript。你有没有试着让原始代码保持原样,看看它是否有效?或者你需要更多的东西吗?@DougStevenson它的一个变体(使用require而不是import)确实有效(因为它构建和部署了,但似乎对冷启动时间没有显著影响)。老实说,我是从导入开始的,因为类型脚本头上的require会导致错误/警告。我通常会忽略VS代码中的这些警告。导入与要求不完全相同。此时,一些冷启动时间(尤其是Firestore)通常是不可避免的。这不起作用。没有函数上载,以您的示例为例。您是否按照我提到的方式构造了目录?代码的工作非常简单。首先将TypeScript文件转换为JavaScript(.js)文件,然后,index.js(从index.ts转换而来)查找以.f.js结尾的所有文件,并上载由.f.js文件导出的函数。还要注意,我已经更新了文件夹结构。除此之外,如果您遇到任何错误,请让我们知道。如果任何人在process.env.FUNCTION\u NAME中未定义,请使用procecess.env.K\u服务,而不是使用typescript,可以这样做吗?尝试此操作时,我不断收到错误“无法加载文件lib/index.js”。谢谢。是的,这是一个TS和JS兼容的库。如果您在github问题跟踪程序中留下更详细的问题,我很乐意帮助您解决。尝试使用最新版本和v2.0.1,看看其中一个是否为您修复了它。
import * as functions from 'firebase-functions';

exports = module.exports = functions.https.onRequest((req, res) => {
    res.status(200).json({'status':'OK'})
})
export default functions.http.onRequest()...
/// OR
const func1 = functions.http.onRequest()...
export default func1;