Node.js发送FCM通知时如何仅安装googleapis必要模块
Node.js FCM功能按需安装Google依赖方案
现有实现代码
const errorCodes = require('source/error-codes'); const PropertiesReader = require('properties-reader'); const serviceAccount = require("service-account.json"); const fetch = require('node-fetch'); var { google } = require('googleapis'); var MESSAGING_SCOPE = 'https://www.googleapis.com/auth/firebase.messaging'; var SCOPES = [MESSAGING_SCOPE]; const prop = PropertiesReader('properties.properties'); exports.sendSingleNotification = async (event, context) => { var PROJECT_ID = "xxx"; if (event.body == null && event.body == undefined) { var response = errorCodes.missing_parameters; return response; } try { let body = JSON.parse(event.body) console.log("body", body); let promise = new Promise(function(resolve, reject) { var key = require("service-account.json"); var jwtClient = new google.auth.JWT( key.client_email, null, key.private_key, SCOPES, null ); jwtClient.authorize(function(err, tokens) { if (err) { reject(err); return { "error": "error 1" }; } console.log("resolve"); console.log(tokens); resolve(tokens.access_token); }); }); let accessToken = await promise; console.log("access token"); console.log(accessToken); var message = { "message": { "token": body.fcmToken, "notification": { "title": "Portugal vs. Denmark", "body": "great match!" } } }; const response = await fetch('https://fcm.googleapis.com/v1/projects/' + PROJECT_ID + '/messages:send', { method: 'post', body: JSON.stringify(message), headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + accessToken } }); const data = await response.json(); return { "message": data } } catch (error) { console.log(error); return { "error 2": error } } };
问题说明
当前上述代码可正常运行,但通过npm install googleapis安装了全量googleapis npm包,引入了大量业务不需要的模块,既增加了应用的编译耗时,也大概率会提升该AWS Lambda应用的冷启动时长。根据googleapis官方文档说明,开发者可按需安装特定模块以降低启动耗时,需要确认:结合上述代码的实现逻辑,无需安装全量googleapis包的前提下,仅需要安装哪些对应模块即可满足功能需求?
解决方案
你当前代码仅用到了Google JWT授权能力,FCM发送请求是自行通过node-fetch封装实现,没有用到googleapis包内的其他服务客户端,因此完全不需要安装全量googleapis包,仅需要安装独立的认证依赖即可。
操作步骤
- 卸载全量googleapis包:执行命令
npm uninstall googleapis - 安装独立认证模块:执行命令
npm install google-auth-library,这个包是Google官方拆分出的专门负责认证授权的独立模块,体积极小,不会引入冗余依赖 - 修改代码引入逻辑,将原有从googleapis引入auth的代码替换为从独立包引入,其余业务逻辑无需改动:
// 删除原有引入代码 // var { google } = require('googleapis'); // 替换为以下引入 const { JWT } = require('google-auth-library'); // 原有JWT实例化代码修改为 var jwtClient = new JWT( key.client_email, null, key.private_key, SCOPES, null ); // 后续jwtClient.authorize以及FCM发送逻辑完全保持原有写法即可,功能无任何差异
注意:替换后依赖体积会缩减90%以上,能明显降低AWS Lambda冷启动耗时,同时依赖安装、项目编译的速度也会有明显提升。
内容的提问来源于stack exchange,提问作者PeakGen
相关产品推荐
相关产品推荐

