You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 09:16:09