集成pg-postgis-types时遇pgtypes.fetcher is not a function错误求助
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实在搞不定,直接手动注册类型也行:- 先查数据库里geometry类型的oid:
SELECT oid FROM pg_type WHERE typname = 'geometry'; - 然后用pg的types模块注册解析器:
const pg = require('pg'); // 替换成你查到的oid const GEOMETRY_OID = 12345; pg.types.setTypeParser(GEOMETRY_OID, (value) => { // 把数据库返回的二进制或字符串转成GeoJSON return JSON.parse(value); });- 先查数据库里geometry类型的oid:
内容的提问来源于stack exchange,提问作者msc

