在Firebase Cloud Functions中使用Google Vision API时遇TypeError错误
解决Firebase Cloud Functions中Google Vision API初始化报错的问题
你遇到的TypeError: require(...) is not a function错误,核心原因是你使用的@google-cloud/vision@0.14.0版本已经更新了SDK的初始化逻辑,不再支持旧示例里直接调用require('@google-cloud/vision')()的写法。下面是具体的修复步骤:
1. 修正Vision SDK的初始化代码
把原来的Vision导入语句:
const vision = require('@google-cloud/vision')();
替换为新版本的客户端初始化方式:
const vision = require('@google-cloud/vision').v1; const client = new vision.ImageAnnotatorClient();
新版本的Vision SDK采用了类实例化的方式创建客户端,不再直接导出可调用的初始化函数,这是导致你报错的直接原因。
2. 更新安全检测的调用逻辑
旧示例里的detectSafeSearch方法在新版本中也被替换,同时返回的数据结构也发生了变化——原来的布尔值判断变成了置信度枚举值。你需要修改blurOffensiveImages函数中的检测逻辑:
把原来的:
return vision.detectSafeSearch(file).then(data => { const safeSearch = data[0]; console.log('SafeSearch results on image', safeSearch); if (safeSearch.adult || safeSearch.violence) { return blurImage(object.name, object.bucket, object.metadata); } });
替换为:
return client.safeSearchDetection(file).then(data => { const safeSearch = data[0].safeSearchAnnotation; console.log('SafeSearch results on image', safeSearch); // 新版本置信度为枚举值,仅当达到LIKELY/VERY_LIKELY时判定为违规 if (safeSearch.adult === 'LIKELY' || safeSearch.adult === 'VERY_LIKELY' || safeSearch.violence === 'LIKELY' || safeSearch.violence === 'VERY_LIKELY') { return blurImage(object.name, object.bucket, object.metadata); } });
3. 验证修改后的完整代码片段
修改后的核心代码部分如下,blurImage函数可以保持原逻辑不变:
'use strict'; const functions = require('firebase-functions'); const mkdirp = require('mkdirp-promise'); const gcs = require('@google-cloud/storage')(); // 修正Vision SDK导入 const vision = require('@google-cloud/vision').v1; const client = new vision.ImageAnnotatorClient(); const spawn = require('child-process-promise').spawn; const path = require('path'); const os = require('os'); const fs = require('fs'); exports.blurOffensiveImages = functions.storage.object().onChange(event => { const object = event.data; const file = gcs.bucket(object.bucket).file(object.name); if (object.resourceState === 'not_exists') { return console.log('This is a deletion event.'); } // 修正SafeSearch调用逻辑 return client.safeSearchDetection(file).then(data => { const safeSearch = data[0].safeSearchAnnotation; console.log('SafeSearch results on image', safeSearch); if (safeSearch.adult === 'LIKELY' || safeSearch.adult === 'VERY_LIKELY' || safeSearch.violence === 'LIKELY' || safeSearch.violence === 'VERY_LIKELY') { return blurImage(object.name, object.bucket, object.metadata); } }); }); // blurImage函数保持原代码不变...
完成以上修改后,重新运行firebase deploy --only functions应该就能成功部署了。
内容的提问来源于stack exchange,提问作者Tobias Muratore
相关产品推荐
相关产品推荐

