1

我的 Express + NodeJS 应用程序出现错误。我正在使用来自 CoinAPI.io 的 API,过去我曾遇到过从 API 获取字节数组作为响应的问题。我已经调查了这个问题,并在过去用 a 解决了它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 数据库中。所以,我尝试对insertManybodyBuffer.concat. 但现在我收到以下错误。

MongoError: docs parameter must be an array of documents

我在集合插入之前做了一个,并且正文将我刚刚console.log(json)进行 concat的字节数组转储到控制台中,我不知道为什么。

编辑:作为对 Sohail 关于 using的回应.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
  ]
}

我仍然收到插入字节数组/缓冲区的错误

4

1 回答 1

1

您需要将Buffer对象转换为mongo document对象。您可以使用buffer.toString()方法,然后使用方法解析它JSON.parse以转换stringobject.

尝试这个。

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');
于 2020-04-11T03:12:54.190 回答