@vitaly-t的答案已经解释了一切!
对于@vitaly-t答案中的postgree隐式全局转换(解决方案3),以下是需要知道的:
const typesBuiltins = {
BOOL: 16,
BYTEA: 17,
CHAR: 18,
INT8: 20,
INT2: 21,
INT4: 23,
REGPROC: 24,
TEXT: 25,
OID: 26,
TID: 27,
XID: 28,
CID: 29,
JSON: 114,
XML: 142,
PG_NODE_TREE: 194,
SMGR: 210,
PATH: 602,
POLYGON: 604,
CIDR: 650,
FLOAT4: 700,
FLOAT8: 701,
ABSTIME: 702,
RELTIME: 703,
TINTERVAL: 704,
CIRCLE: 718,
MACADDR8: 774,
MONEY: 790,
MACADDR: 829,
INET: 869,
ACLITEM: 1033,
BPCHAR: 1042,
VARCHAR: 1043,
DATE: 1082,
TIME: 1083,
TIMESTAMP: 1114,
TIMESTAMPTZ: 1184,
INTERVAL: 1186,
TIMETZ: 1266,
BIT: 1560,
VARBIT: 1562,
NUMERIC: 1700,
REFCURSOR: 1790,
REGPROCEDURE: 2202,
REGOPER: 2203,
REGOPERATOR: 2204,
REGCLASS: 2205,
REGTYPE: 2206,
UUID: 2950,
TXID_SNAPSHOT: 2970,
PG_LSN: 3220,
PG_NDISTINCT: 3361,
PG_DEPENDENCIES: 3402,
TSVECTOR: 3614,
TSQUERY: 3615,
GTSVECTOR: 3642,
REGCONFIG: 3734,
REGDICTIONARY: 3769,
JSONB: 3802,
REGNAMESPACE: 4089,
REGROLE: 4096
};
您可以在此处找到:
https://github.com/brianc/node-pg-types/blob/master/lib/builtins.js
通常您可以通过以下方式访问它。
const pg = require('pg');
pg.types.setTypeParser(pg.types.builtins.INT8, (value: string) => {
return parseInt(value);
});
pg.types.setTypeParser(pg.types.builtins.FLOAT8, (value: string) => {
return parseFloat(value);
});
pg.types.setTypeParser(pg.types.builtins.NUMERIC, (value: string) => {
return parseFloat(value);
});
通常可以处理所有数字数据。
如果由于某种原因无法访问pg.types.builtins(在我的情况下,使用TypeScript时出现了一些问题)。您只需将其复制粘贴即可。或直接使用相应的映射数字。
更新(避免混淆)
截至目前,"pg":"^7.11.0"。
pg正在使用pg-types 2.0.1,该版本根本不包括内置函数。
之前的所有版本也是如此。
这导致在任何版本中都无法使用访问pg.types.builtins.
。
解决方案就像我在当前项目中所做的那样,复制并粘贴该映射(请检查上面的片段以复制它)。
![enter image description here](https://istack.dev59.com/9hsxi.webp)
或直接使用给定列表中的对应映射。
pgp.pg.types.setTypeParser(20, parseInt)
另一个解决办法是直接使用最新版本的 pg-types 软件包。
const types = require('pg-types');
否则,@vitaly-t提交的PR可以在下面的链接中看到:
https://github.com/brianc/node-postgres/pull/1937/commits/c7666214833715ac2494b81865cfe1ea7cef9289
它更新了pg
包(node-postgres)内的pg-types
版本。
![enter image description here](https://istack.dev59.com/epmtV.webp)
一旦被接受,最初的示例将开始工作。
请注意,我的源最初是pg-types
的官方README:
https://github.com/brianc/node-pg-types
![enter image description here](https://istack.dev59.com/gOnzZ.webp)
另一个也是最后一个注意点:
这个涉及使用typescript。
pg-types
的typescript类型不包括内置类型,当前版本为"pg-types": "^2.1.0"
。需要进行更新。所以您要么自己添加类型。
typeof types & {builtins: {[key in builtinsTypes]: number}}
其中builtinsTypes是所有属性名称的并集。
(不过我只是发现复制整个对象更快、更短、更简洁)。
您可以使用如下枚举来完成此操作:
enum TypeId {
BOOL = 16,
BYTEA = 17,
CHAR = 18,
INT8 = 20,
INT2 = 21,
INT4 = 23,
REGPROC = 24,
TEXT = 25,
OID = 26,
TID = 27,
XID = 28,
CID = 29,
JSON = 114,
XML = 142,
PG_NODE_TREE = 194,
SMGR = 210,
PATH = 602,
POLYGON = 604,
CIDR = 650,
FLOAT4 = 700,
FLOAT8 = 701,
ABSTIME = 702,
RELTIME = 703,
TINTERVAL = 704,
CIRCLE = 718,
MACADDR8 = 774,
MONEY = 790,
MACADDR = 829,
INET = 869,
ACLITEM = 1033,
BPCHAR = 1042,
VARCHAR = 1043,
DATE = 1082,
TIME = 1083,
TIMESTAMP = 1114,
TIMESTAMPTZ = 1184,
INTERVAL = 1186,
TIMETZ = 1266,
BIT = 1560,
VARBIT = 1562,
NUMERIC = 1700,
REFCURSOR = 1790,
REGPROCEDURE = 2202,
REGOPER = 2203,
REGOPERATOR = 2204,
REGCLASS = 2205,
REGTYPE = 2206,
UUID = 2950,
TXID_SNAPSHOT = 2970,
PG_LSN = 3220,
PG_NDISTINCT = 3361,
PG_DEPENDENCIES = 3402,
TSVECTOR = 3614,
TSQUERY = 3615,
GTSVECTOR = 3642,
REGCONFIG = 3734,
REGDICTIONARY = 3769,
JSONB = 3802,
REGNAMESPACE = 4089,
REGROLE = 4096
}
在pg-promise
中执行如下操作:
https://github.com/vitaly-t/pg-promise/blob/v9/typescript/pg-subset.d.ts#L103一切更新完成后,使用pg就可以了。
更新
该软件包已更新,您可以按预期使用它。
import { types } from 'pg';
types.setTypeParser(types.builtins.INT8, (value: string) => {
return parseInt(value);
});
types.setTypeParser(types.builtins.FLOAT8, (value: string) => {
return parseFloat(value);
});
types.setTypeParser(types.builtins.NUMERIC, (value: string) => {
return parseFloat(value);
});
还需要查看以上vitaly-t回答的UPDATE-2部分
https://dev59.com/eVkT5IYBdhLWcg3wB7Is#39176670
JSON.stringify
来序列化数据,而这是绝对不应该的。要对包含BigInt
的数据进行序列化,请使用pgp.as.json
,详见NigInt手册。 - vitaly-ttypeParser
并在我的 Express JS 应用程序中使用了res.send(pgp.as.json(result, true));
以 JSON 格式发送数据,一切都正常工作! - umbe1987