部署Firebase Cloud Function时遇到Axios导入错误
问题分析
你遇到的核心矛盾是Firebase Cloud Functions 默认采用 CommonJS 模块系统,但你混用了 CommonJS 的require和 ES 模块的import,触发了 ESLint 的语法校验错误;而纯用require时,要么是依赖未正确安装,要么是异步执行顺序错误导致运行时异常。另外你的代码还有一个容易被忽略的问题:异步请求未等待完成就执行后续步骤,会导致数据处理和上传拿到空数据。
解决方案一:完全使用 CommonJS 模块(推荐,适配 Firebase 默认配置)
这是最省心的方案,不需要额外修改配置,只需调整代码和依赖:
确保 axios 依赖正确安装
一定要在functions目录下执行安装命令,避免依赖安装到项目根目录:cd functions npm install axios替换 import 为 require
把 ES 模块的导入语句改成 CommonJS 格式:const admin = require("firebase-admin"); const axios = require("axios"); // 替换原import axios的语句修复异步执行顺序问题
你的getTheData里的 axios 请求是异步操作,但你直接同步调用processData和uploadData,此时接口还没返回数据,tempDataBeforeProccessing还是空数组。需要用async/await保证执行顺序:// 把getTheData改为async函数,等待请求完成 const getTheData = async function() { tempDataBeforeProccessing = []; // 注意:axios.post的第三个参数不需要重复写hostname/port/path,URL已经包含这些信息 const res = await axios.post("https://p2p.binance.com/bapi/c2c/v2/friendly/c2c/adv/search", baseObj, { headers: { "Content-Type": "application/json", }, }); tempDataBeforeProccessing = res.data.data; }; // entireCall也改为async,依次等待各步骤完成 const entireCall = async function() { await getTheData(); // 等待数据请求返回 processData(); await uploadData(); // Firestore操作也是异步,需等待上传完成 };同时优化
uploadData的异步逻辑,用Promise.all提升效率:const uploadData = async function() { await database.collection("SebiBinanceSale").doc("BCR Bank").delete(); // 并行处理所有文档写入,比循环await更快 const uploadTasks = finalData.map((item, index) => { return database.collection("SebiBinanceSale").doc("BCR Bank") .collection("1").doc(index.toString()) .set(item); // 直接传入item即可,无需重复解构属性 }); await Promise.all(uploadTasks); console.log("Success Upload of the data "); };
解决方案二:切换为 ES 模块系统(适合习惯 ES 语法的场景)
如果坚持用import,需要修改配置适配 ES 模块:
修改 functions/package.json
添加"type": "module"字段,告诉 Node.js 这是 ES 模块项目:{ "name": "functions", "type": "module", "scripts": { // 保留原有脚本 }, // 其他依赖配置... }统一使用 ES 模块导入
把所有require改为import:import admin from "firebase-admin"; import axios from "axios";调整 ESLint 配置
在functions/.eslintrc.js中修改parserOptions,解决import语法报错:module.exports = { // 其他配置... parserOptions: { ecmaVersion: "latest", sourceType: "module" // 新增这行,允许ES模块语法 }, // 其他配置... };同样需要修复异步执行顺序问题(和方案一的异步修复步骤完全一致)
额外注意事项
- 部署前记得在
functions目录下执行npm run lint,确保语法校验通过 - Firestore 的所有写入/删除操作都是异步的,必须用
await或then等待完成,否则会出现数据丢失或不完整的情况
内容的提问来源于stack exchange,提问作者Alex97

