节点 - 插入 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');
我的 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');