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

Laravel报错:Undefined property: stdClass::$latitude 求助

排查 Undefined property: stdClass::$latitude 错误

这个错误说明你的Ipstack类尝试访问$this->data->latitude,但Ipstack API返回的数据里根本没有latitude这个属性。我们可以从以下几个方向逐步定位和解决问题:

1. 先确认Ipstack API实际返回的内容

首先得搞清楚API到底给你返回了什么——大概率不是正常的地理数据,而是错误提示。你可以在Driver.php的getDataFor方法里临时加一段代码,把响应内容打印或记录到日志里:

public function getDataFor(Visit $visit) {
    $client = new Client();
    $response = $client->get($this->getEndpoint($visit->ip));
    if ($response->getStatusCode() == 200) {
        $bodyContent = $response->getBody()->getContents();
        // 临时打印响应内容,或者写入Laravel日志
        \Log::info('Ipstack API 响应内容: ' . $bodyContent);
        $this->data = json_decode($bodyContent);
        return $this;
    }
    return null;
}

运行项目后查看日志,你大概率会遇到这些常见问题:

  • API密钥无效/未激活:返回类似{"success":false,"error":{"code":101,"type":"invalid_access_key","info":"Your API key is invalid or inactive."}}的错误
  • 查询私有/本地IP:Ipstack免费版不支持查询127.0.0.1、192.168.x.x这类私有IP,这类请求会返回不含地理字段的数据
  • 请求次数超限:超过免费版的调用额度,返回对应的错误提示

2. 完善API错误处理逻辑

当前的getDataFor方法只判断了状态码200,但Ipstack很多错误场景下依然会返回200状态码,只是在响应体里藏着error字段。我们需要修改方法来处理这种情况:

public function getDataFor(Visit $visit) {
    $client = new Client();
    try {
        $response = $client->get($this->getEndpoint($visit->ip));
        if ($response->getStatusCode() == 200) {
            $bodyContent = $response->getBody()->getContents();
            $this->data = json_decode($bodyContent);
            
            // 检查是否包含API错误信息
            if (isset($this->data->error)) {
                \Log::error('Ipstack API 错误: ' . json_encode($this->data->error));
                return null;
            }
            
            return $this;
        }
    } catch (\Exception $e) {
        \Log::error('Ipstack API 请求失败: ' . $e->getMessage());
        return null;
    }
    return null;
}

这样可以提前捕获API层面的错误,避免后续调用latitude()等方法时触发属性不存在的报错。

3. 在Ipstack类中增加属性存在性检查

即使API返回正常数据,某些特殊IP(比如匿名代理IP)可能确实没有对应的地理信息。我们可以在访问属性前增加判断,避免报错:

class Ipstack extends Driver {
    // 保留原有getEndpoint方法不变
    
    public function latitude() {
        return $this->data->latitude ?? null;
    }

    public function longitude() {
        return $this->data->longitude ?? null;
    }

    public function country() {
        return $this->data->country_name ?? null;
    }

    public function countryCode() {
        return $this->data->country_code ?? null;
    }

    public function city() {
        return $this->data->city ?? null;
    }
}

使用PHP7+的??空合并运算符,当属性不存在时返回null而不是抛出错误。如果是Laravel项目,也可以用optional($this->data)->latitude来实现同样的效果。

4. 最后验证基础配置

  • 确认.env或config/visitortracker.php里的ipstack_key是正确的,并且在Ipstack后台处于激活状态
  • 测试时尽量使用公网IP,避免用本地私有IP(免费版Ipstack不支持这类IP的地理查询)

内容的提问来源于stack exchange,提问作者Vardana Bhanot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:51:30