节点 - 插入 MongoDB(字节数组)时抛出异常

Node - Exception thrown when inserting into MongoDB (byte array)

我的 Express + NodeJS 应用出现错误。我正在使用来自 CoinAPI.io 的 API,过去我遇到过从 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 数据库中。因此,我尝试对从 Buffer.concat 创建的 body 对象执行 insertMany。但是现在我收到以下错误。

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

我仍然得到插入字节的错误array/buffer

您需要将 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');