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

Firebase函数中使用密钥调用@googlemaps/google-maps-services-js失败

解决Firebase函数中Google Maps API密钥无法读取的问题

核心问题分析

你遇到的问题主要源于两个点:一是Secret Manager的defineSecret使用方式错误(直接传递对象而非实际密钥字符串),二是函数未正确配置权限/注入密钥,导致请求Google Maps API时密钥无法被正常识别。


解决方案

1. 正确使用Firebase Secret Manager

defineSecret返回的是SecretParam对象,并非直接的密钥字符串,必须按以下步骤配置和使用:

步骤1:给函数配置Secret访问权限

修改index.js,在onRequest中添加secrets配置,让函数有权限读取你的Google API密钥:

const { onRequest } = require("firebase-functions/v2/https");
const { placesRequest, googleApiKey } = require("./places");
const { Client } = require("@googlemaps/google-maps-services-js");
const client = new Client({});

// 关键:声明函数允许访问指定Secret
exports.placesRequest = onRequest({ secrets: [googleApiKey] }, (request, response) => {
  placesRequest(request, response, client);
});

步骤2:在places.js中获取实际密钥值

导出googleApiKey供index.js配置使用,并通过.value()获取真实的密钥字符串:

const { defineSecret } = require("firebase-functions/params");
// 导出Secret对象给index.js配置权限
exports.googleApiKey = defineSecret("GOOGLE_API_KEY");
const { mocks, addMockImages } = require("./mock");
const url = require("url");
const functions = require("firebase-functions");

module.exports.placesRequest = (req, res, client) => {
  const { location, mock } = url.parse(req.url, true).query;

  if (mock === "true") {
    const data = mocks[location];
    if (data) {
      data.results = data.results.map(addMockImages);
    }
    return res.json(data); // 必须加return,避免继续执行后续API请求
  }

  // 获取实际密钥字符串
  const apiKey = exports.googleApiKey.value();
  functions.logger.log("API Key类型:", typeof apiKey);
  functions.logger.log("API Key长度:", apiKey?.length);

  client
    .placesNearby({
      params: {
        location,
        radius: 1500,
        key: apiKey,
      },
      timeout: 1000,
    })
    .then((response) => {
      response.data.results = response.data.results.map(addGoogleImage);
      return res.json(response.data);
    })
    .catch((err) => {
      // 打印详细错误,方便排查
      functions.logger.error("Google API请求失败:", err.response?.data || err.message);
      res.status(err.response?.status || 400);
      return res.send(err.response?.data || err.message);
    });
};

步骤3:上传密钥到Firebase Secret Manager

确保你已经将密钥部署到Firebase:

firebase functions:secrets:set GOOGLE_API_KEY

2. 环境变量方式的排查与修复

如果使用环境变量而非Secret Manager,需注意:

  • 本地开发:在项目根目录创建.env文件,添加GOOGLE_API_KEY=你的密钥,v2函数默认支持读取该文件。
  • 部署环境:通过Google Cloud Console的函数配置页面手动添加环境变量GOOGLE_API_KEY;或用命令行:
    firebase functions:config:set google.api_key="你的密钥"
    
    此时代码中需改为functions.config().google.api_key,而非process.env.GOOGLE_API_KEY。

3. 关键调试技巧

  • 打印密钥的类型和长度,确认是否拿到有效字符串(避免空值、多余空格或对象)。
  • 在catch块中打印Google API的详细错误响应,err.response.data会明确告知是密钥无效、权限不足还是其他问题。
  • 检查Google Cloud Console的函数日志,确认密钥是否被正确注入。

内容的提问来源于stack exchange,提问作者Giorgia Sambrotta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:15:05