Google Cloud Functions导出函数报错:handler is not a function
为什么拆分模块后Cloud Functions调用会报"handler is not a function"错误?
我来帮你拆解下这个问题的根源,先对比下两种写法的差异:
能正常运行的写法
这种写法直接在index.js里把getItems函数作为导出对象的属性,Cloud Functions可以直接识别到这个函数作为处理程序:
// index.js module.exports = { getItems: (req, res) => res.send("Hello, World!") };
测试命令:
functions call getItems
返回结果:
Result: Hello, World!
无法运行的写法
你把函数拆分到了单独的getItems.js,但导入方式出了问题:
// getItems.js exports.getItems = (req, res) => res.send("Hello, World!");
// index.js let getItems = require('./getItems'); module.exports = { getItems };
测试命令:
functions call getItems
报错信息:
Error: TypeError: handler is not a function at app.use.err (/Users...
问题核心原因
这里的关键是模块导入的内容是什么:
- 当你执行
require('./getItems')时,你拿到的是整个getItems.js的导出对象(也就是{ getItems: [Function] }),而不是getItems函数本身。 - 你把这个对象赋值给了
getItems变量,然后又把它作为module.exports的属性,最终导出的结构变成了{ getItems: { getItems: [Function] } }。 - Cloud Functions期望
getItems对应的是一个处理函数,但实际拿到的是一个嵌套对象,自然就会抛出handler is not a function的错误。
修复方式
只需要调整导入逻辑,直接提取出真正的函数即可,两种写法都可以:
方式1:使用解构赋值(推荐)
// index.js const { getItems } = require('./getItems'); module.exports = { getItems };
方式2:直接访问对象属性
// index.js const getItemsModule = require('./getItems'); module.exports = { getItems: getItemsModule.getItems };
修改后再用functions call getItems测试,就能正常返回Result: Hello, World!了。
内容的提问来源于stack exchange,提问作者sdfsdf
相关产品推荐
相关产品推荐

