2016-11-16 65 views
1

我想填充一個數組,使用MYSQL查詢獲取所有行並將行推送到WordList的表上。如何返回MySQL查詢的回調並推送到Node.js中的數組?

我可以在方法中打印每行,但是當我離開該方法的範圍時,它不會將任何內容推送到Wordlist。

function getParrotMessage() { 

    wordList = []; 

    console.log(wordList); 

    // Implementation 
    getWord('result', function (err, result) { 

     console.log(result); // works, prints the row data in MySQL table 
     wordList.push(result); // doesn't work 

    }); 

    console.log(wordList); 
    return parrot_message; 
} 

// Method 
function getWord(word, callback) { 
    var query = con.query('SELECT * FROM word_table'); 
    query.on('result', function (row) { 
     callback(null, row.word); 
    }); 
}; 

單詞表:[]

單詞一覽顯示爲空數組。

任何幫助將不勝感激,只是用JavaScript開始,Node.js的

+0

你的方法'getWord'是** **同步!所以第二個'console.log(wordList);'是在返回任何結果之前打印的(在你甚至第一次調用'wordList.push(result);'之前) – Molda

+0

那麼我怎麼才能真正檢索結果數據,所以我可以操縱它並做各種其他事情。我不需要打印它。 – user1920076

回答

1

你的方法是屏幕取詞異步

所以第二console.log(wordList);之前任何結果印刷返回(你甚至呼籲wordList.push(result);首次之前)

而且因爲你在查詢數據庫中(異步)getParrotMessage功能,你需要使用回調(或Promise或其他任何可以使用的)而不是return語句。

function getParrotMessage(callback) { 

    getWord('result', function (err, result) { 

     if(err || !result.length) return callback('error or no results'); 
     // since result is array of objects [{word: 'someword'},{word: 'someword2'}] let's remap it 
     result = result.map(obj => obj.word); 
     // result should now look like ['someword','someword2'] 
     // return it 
     callback(null, result); 

    }); 
} 

function getWord(word, callback) { 
    con.query('SELECT * FROM word_table', function(err, rows) { 
     if(err) return callback(err); 
     callback(null, rows); 
    }); 
}; 

現在這樣使用它

getParrotMessage(function(err, words){ 
    // words => ['someword','someword2'] 

}); 
+0

感謝您的幫助,讓它工作! – user1920076