Аргумент "size" должен иметь номер типа в Nodejs - PullRequest
0 голосов
/ 26 августа 2018

Я хочу преобразовать двоичный _id mongodb в UUID с помощью узла, чтобы найти и найти ответ на этом посте :

Я хочу вставить этот UUId в базу данных postgres.моя функция pg на node.js:

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'), но, похоже, новый буфер устарел ..

Это моя версия Node и Npm:

node -v
v10.8.0

npm -v
6.2.0

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Я изменил эту часть

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

Я надеюсь, что эти изменения помогут парням.

0 голосов
/ 26 августа 2018

Аргумент size в Buffer.alloc(size), необязательно, требует числа, потому что это аргумент, который сообщает методу, сколько байтов нужно выделить.

Ваш Bin2HexUUID(element.UserId) передает сам объект element.UserId этому методу (ваше сообщение об ошибке сообщает вам об этом, когда говорится "объект полученного типа"). Это не то, что хочет метод. То, что он хочет, это размер (длина) Element.UserId.

Итак, получите длину Element.UserId и передайте ее вместо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...