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

TypeScript项目使用fcm-node遇类型定义缺失及构建报错的解决问询

在TypeScript项目中使用FCM推送通知的解决方案

方案1:手动编写fcm-node的类型声明文件

由于官方未提供@types/fcm-node,你可以自行创建类型声明文件让TypeScript识别该模块:

  1. 在项目中创建src/types/fcm-node/index.d.ts文件
  2. 写入适配fcm-node API的基础类型声明(可根据实际使用的方法补充):
declare module 'fcm-node' {
  interface NotificationPayload {
    to: string;
    notification: {
      title: string;
      body: string;
    };
    data?: Record<string, string>;
  }

  class FCM {
    constructor(serverKey: string);
    send(payload: NotificationPayload, callback: (err: Error | null, response: any) => void): void;
  }

  export = FCM;
}
  1. 修改tsconfig.json,让TypeScript识别自定义类型目录:
{
  "compilerOptions": {
    "typeRoots": ["./node_modules/@types", "./src/types"],
    "outDir": "./dist"
  },
  "include": ["src/**/*"]
}

之后即可在.ts文件中正常导入使用:

import FCM = require('fcm-node');
const fcm = new FCM('你的FCM服务器密钥');

方案2:调整编译配置,确保.js文件被正确输出到dist目录

build后找不到notification.service.js的问题,是因为TypeScript编译器默认不会复制.js文件到输出目录,可通过以下方式解决:

  1. 修改tsconfig.json,将.js文件加入编译包含范围:
{
  "compilerOptions": {
    "outDir": "./dist"
  },
  "include": ["src/**/*.ts", "src/**/*.js"]
}
  1. 如果上述配置无效,可在build脚本中手动复制文件:
    修改package.json的scripts字段:
{
  "scripts": {
    "build": "tsc && cp src/notification.service.js dist/",
    "dev": "ts-node src/index.ts"
  }
}

执行npm run build时,会先编译TS文件,再将目标js文件复制到dist目录。

方案3:改用Firebase Admin SDK(推荐)

fcm-node属于第三方封装库,存在维护滞后风险,官方的Firebase Admin SDK原生支持TypeScript,无需额外类型定义,稳定性更强:

  1. 安装依赖:
npm install firebase-admin
  1. 初始化SDK并发送通知:
import * as admin from 'firebase-admin';
import { ServiceAccount } from 'firebase-admin';

// 加载从Firebase控制台下载的服务账号密钥
const serviceAccount = require('./service-account-key.json') as ServiceAccount;

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

// 封装发送通知方法
async function sendFCMNotification(token: string, title: string, body: string) {
  const message = {
    token,
    notification: { title, body }
  };

  try {
    const response = await admin.messaging().send(message);
    console.log('通知发送成功:', response);
  } catch (error) {
    console.error('通知发送失败:', error);
  }
}

内容的提问来源于stack exchange,提问作者Shivam kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 03:36:25