Узел - Исключение, генерируемое при вставке в MongoDB (байтовый массив) - PullRequest
1 голос
/ 11 апреля 2020

Я получаю сообщение об ошибке в моем приложении Express + NodeJS. Я использую API из CoinAPI.io, и в прошлом у меня была проблема с получением массива байтов в качестве ответа от API. Я рассмотрел эту проблему и в прошлом разрешил ее с помощью Buffer.concat, поэтому я могу отправить клиенту json в качестве ответа. Код ниже:

app.get('/build', function(req, res){
    console.log('Building the database...');

    // make client connect to mongo service
    MongoClient.connect(url, function(err, db) {
        if (err) throw err;
        console.log("SUCCESS: Database created");
        let dbo = db.db('lab5');

        // Craft request header
        const options = {
            "method": "GET",
            "hostname": "rest.coinapi.io",
            "path": "/v1/assets",
            "headers": {'X-CoinAPI-Key': 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'}
        };

        // Send request to CoinAPI.io
        const request = https.request(options, response => {
            let chunks = [];
            response.on("data", chunk => {
                chunks.push(chunk);
            });
            response.on('end', () => {
                let json = Buffer.concat(chunks);

                // Insert into the database
                dbo.collection('crypto').insertMany(json, function(insertErr, insertRes) {
                    if (insertErr) throw insertErr;
                    console.log("Number of documents inserted: " + insertRes.insertedCount);
                    db.close();
                });
                console.log('End of request stream')
            });
        });

        request.end();

        // print database name
        console.log("NOTE: db object points to the database : "+ db.databaseName);
        db.close();
    });
    res.end();
})

Это работало раньше, но теперь мне нужно вместо этого вставить полученные данные в базу данных MongoDB. Итак, я пытаюсь сделать insertMany для body объекта, который я создаю из Buffer.concat. Но теперь я получаю следующую ошибку.

MongoError: docs parameter must be an array of documents

Я сделал console.log(json) перед вставкой коллекции, и тело выгружает в консоль байтовый массив, с которым я просто выполнил конкатат, и я не знаю почему ,

РЕДАКТИРОВАТЬ: В ответ на Sohail об использовании .toJSON(), это то, что произошло, когда я попытался преобразовать буфер в json

let buf = Buffer.concat(chunks);
let json = buf.toJSON();
console.log(json);

И когда я консоль журнала json ...

{
  type: 'Buffer',
  data: [
     91,  10,  32,  32, 123,  10,  32,  32,  32,  32,  34,  97,
    115, 115, 101, 116,  95, 105, 100,  34,  58,  32,  34,  78,
     80,  88,  83,  34,  44,  10,  32,  32,  32,  32,  34, 110,
     97, 109, 101,  34,  58,  32,  34,  80, 117, 110, 100, 105,
     32,  88,  34,  44,  10,  32,  32,  32,  32,  34, 116, 121,
    112, 101,  95, 105, 115,  95,  99, 114, 121, 112, 116, 111,
     34,  58,  32,  49,  44,  10,  32,  32,  32,  32,  34, 100,
     97, 116,  97,  95, 115, 116,  97, 114, 116,  34,  58,  32,
     34,  50,  48,  49,
    ... 5165802 more items
  ]
}

и я все еще получаю ошибку вставки байтового массива / буфера

1 Ответ

1 голос
/ 11 апреля 2020

Вам необходимо преобразовать Buffer объект в mongo document объект. Вы можете использовать метод buffer.toString(), а затем проанализировать его методом JSON.parse, чтобы преобразовать string в object.

Попробуйте это.

let buf = Buffer.concat(chunks);
let json = JSON.parse(buf.toString());
// Insert into the database
dbo.collection('crypto').insertMany(json, function (insertErr, insertRes) {
    if (insertErr) throw insertErr;
    console.log("Number of documents inserted: " + insertRes.insertedCount);
    db.close();
});
console.log('End of request stream');
...