TypeScript项目使用fcm-node遇类型定义缺失及构建报错的解决问询
在TypeScript项目中使用FCM推送通知的解决方案
方案1:手动编写fcm-node的类型声明文件
由于官方未提供@types/fcm-node,你可以自行创建类型声明文件让TypeScript识别该模块:
- 在项目中创建
src/types/fcm-node/index.d.ts文件 - 写入适配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; }
- 修改
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文件到输出目录,可通过以下方式解决:
- 修改
tsconfig.json,将.js文件加入编译包含范围:
{ "compilerOptions": { "outDir": "./dist" }, "include": ["src/**/*.ts", "src/**/*.js"] }
- 如果上述配置无效,可在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,无需额外类型定义,稳定性更强:
- 安装依赖:
npm install firebase-admin
- 初始化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
相关产品推荐
相关产品推荐

