我想使用node将mongodb Binary _id转换为UUID,以便进行谷歌搜索并在this post处找到我的响应:
我想将此UUId插入postgres数据库中。这是我在node.js上的pg函数:
function insert(arg) {
console.log('insert location');
arg.forEach(element => {
(async () => {
await pool.query(
`insert into public."Location" ("Id", "Lat", "Lng", "CreationDateTime", "DeviceId", "Topic", "UserId")
VALUES ('${uuidv1()}', ${element.Lat}, ${element.Lng}, $1, ${element.DeviceId}, $2, $3)`,[element.CreationDateTime, element.Topic,Bin2HexUUID(element.UserId)]);
})();
});
}
这是element.UserId
:
Binary {_bsontype: "Binary", sub_type: 4, position: 16, …}
_bsontype:"Binary"
这是Bin2HexUUID
方法:
function Bin2HexUUID(bin){
var hex = new Buffer.alloc(bin, 'base64').toString('hex');
return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, function (){
return arguments[1]+"-"+arguments[2]+"-"+arguments[3]+"-"+arguments[4]+"-"+arguments[5];
});
}
运行脚本时出现此错误:
new Buffer.alloc(bin, 'base64').toString('hex')
NodeError: The "size" argument must be of type number. Received type object
----------------------
(node:2292) UnhandledPromiseRejectionWarning: TypeError [ERR_INVALID_ARG_TYPE]: The "size" argument must be of type number. Received type object
我第一次使用new Buffer(bin, 'base64').toString('hex')
,但似乎不推荐使用新的Buffer。
这是我的Node and Npm版本:
node -v
v10.8.0
npm -v
6.2.0
答案 0 :(得分:2)
size
中的Buffer.alloc(size)
参数需要一个数字,因为它是一个告诉方法要分配多少字节的参数,这并非毫无道理。
您的Bin2HexUUID(element.UserId)
将element.UserId
对象本身传递给此方法(您的错误消息告诉您,当它说“ Received type object”时)。这不是该方法想要的。它需要的是Element.UserId
的 size (长度)。
因此,获取Element.UserId
的长度并将其传递。
答案 1 :(得分:1)
我更改了此部分
Bin2HexUUID(element.UserId)
对此:
Bin2HexUUID(element.UserId.buffer)]);
和方法:
function Bin2HexUUID(bin){
var hex = new Buffer.from(bin, 'base64').toString('hex');
return hex.replace(/^(.{8})(.{4})(.{4})(.{4})(.{12})$/, function (){
return arguments[1]+"-"+arguments[2]+"-"+arguments[3]+"-"+arguments[4]+"-"+arguments[5];
});
}
我希望这种变化对大家有所帮助。