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

集成pg-postgis-types时遇pgtypes.fetcher is not a function错误求助

解决pg-postgis-types集成时pgtypes.fetcher is not a function错误

我在Express+Sequelize+PostgreSQL的实习项目中,尝试集成pg-postgis-types包,严格按照官方文档写的代码,但API返回错误pgtypes.fetcher is not a function。已经确认node_modules里的包定义中fetcher方法确实存在,参考代码如下:

const getgeojson = async (mapID) => {
    try {
        postgis(pgtypes.fetcher(pg, connection), null, (err, oids) => {
            if (err) {
                throw err;
            };  ...

以下是几个可能解决问题的方向:

  • 检查pgtypes的导入方式
    别小看导入的问题,很多时候错误就是这里来的。如果用CommonJS,确保导入写法正确:

    const pgtypes = require('pg-postgis-types');
    const postgis = pgtypes.postgis;
    

    或者直接解构导出的方法:

    const { fetcher, postgis } = require('pg-postgis-types');
    

    如果是ES模块,记得用import替代require,并且确认包是否支持ES模块。

  • 确认传入的pg和connection实例正确
    pgtypes.fetcher需要的是pg包本身的Client/Pool实例,不是Sequelize的实例。如果用Sequelize,得先拿到底层的pg连接:

    const sequelize = new Sequelize(你的数据库配置);
    // 先确保连接成功
    await sequelize.authenticate();
    // 获取底层pg连接
    const pgConnection = await sequelize.connectionManager.getConnection();
    // 再传入fetcher
    postgis(pgtypes.fetcher(pg, pgConnection), null, (err, oids) => { ... });
    
  • 核对版本兼容性
    就算node_modules里有fetcher,也可能是pg版本和pg-postgis-types不兼容导致调用方式失效。去看pg-postgis-types的package.json里的peerDependencies,看看要求的pg版本范围,然后调整你的pg版本到匹配的区间。

  • 把回调改成async/await写法
    你的函数是async,但内部用了回调,可能存在上下文冲突。把postgis调用包装成Promise试试:

    const getgeojson = async (mapID) => {
        try {
            const oids = await new Promise((resolve, reject) => {
                postgis(pgtypes.fetcher(pg, connection), null, (err, oids) => {
                    err ? reject(err) : resolve(oids);
                });
            });
            // 后续处理逻辑
        } catch (err) {
            console.error(err);
            throw err;
        }
    };
    
  • 手动注册PostGIS类型(替代方案)
    如果pg-postgis-types的fetcher实在搞不定,直接手动注册类型也行:

    1. 先查数据库里geometry类型的oid:SELECT oid FROM pg_type WHERE typname = 'geometry';
    2. 然后用pg的types模块注册解析器:
    const pg = require('pg');
    // 替换成你查到的oid
    const GEOMETRY_OID = 12345;
    pg.types.setTypeParser(GEOMETRY_OID, (value) => {
        // 把数据库返回的二进制或字符串转成GeoJSON
        return JSON.parse(value);
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:50:35