“ size”参数在Node.js中必须为数字类型

时间:2018-08-26 04:00:55

标签: node.js mongodb postgresql

我想使用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

2 个答案:

答案 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];
    });
}

我希望这种变化对大家有所帮助。