iT邦幫忙

0

用mongodb查詢資料並拆解,但無法傳給函式外部的陣列

我想嘗試取得資料庫裡面的一筆資料中的content的內容,並傳給參數updateData
可是資料卻無法確實地傳給updateData,中間有陸續用幾個console.log確認數值正確
最後發現在出了collection.find的括號之後數值就跑掉了
以下是我的程式碼,counter是函式外部的一個變數用以控制取得第幾個資料
function readData(counter,updateData){//updateData=[]
MongoClient.connect(mongoUrl,function(err,client){
if (err) throw err;
console.log('Success!');
var db = client.db(dbName);
db.collection('testData',function(err,collection){
if (err) throw err;
collection.find({}).toArray(function(err,docs){
if (err) throw err;
var objKey = Object.keys(docs);//console.log(objKey);
objKey.forEach(function(objectid){
var items = Object.keys(docs[objectid]);//console.log(items);
items.forEach(function() {
updateData = docs[counter]['content'];
client.close();
});
});console.log(updateData);//印出[14, 1, 1, 6, 7 ,3 , 40, 10, 13, 5]
});console.log(updateData);//印出[],出了這個括號後就會變回外部宣告的值[]
});
});
}
想請教各位如何修改外部的updateData?

readData 用callback的方式夾帶updateData回去
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
screenleon
iT邦新手 1 級 ‧ 2020-08-21 14:44:34
最佳解答

用callback 把要的資料回傳
或者你可以嘗試用promise的方式
不過你這裡好像沒有用到promise,就沒有列出來了

const mongodb = require('mongodb');

const mongoUrl = 'MONGODB';
const dbName = "DB_NAME";
const collectionName = 'COLLECTION_NAME';

var counter = null;
var updateData = '';

function readData(counter, updateData, done) {//updateData=[]
    new mongodb.MongoClient(mongoUrl, { useUnifiedTopology: true }).connect(function (err, client) {
        if (err) throw err;
        console.log('Success!');
        client.db(dbName).collection(collectionName).find({}).toArray((err, docs) => {
            if (err) throw err;
            var objKey = Object.keys(docs);
            // console.log(objKey);
            objKey.forEach(function (objectid) {
                var items = Object.keys(docs[objectid]);
                // console.log(items);
                items.forEach(function () {
                    updateData = docs[counter]['content'];
                    client.close();
                });
            });
            console.log(docs);//印出[14, 1, 1, 6, 7 ,3 , 40, 10, 13, 5]
            done(null, docs);
        })
    })
}

const a = readData(counter, updateData, (err, data) => {
    if(err) console.error(err);
    console.log(data);
});

我要發表回答

立即登入回答