2014-07-23 65 views
0

我嘗試導出一個功能是這樣的:如何正確地導出/需要

exports.query = function(request){ 
    conn.query(request, function(err, rows, fields){ 
     if(err) console.log(err); 
     return rows[0].id; 
    }); 
} 

,並使用它:

var mysql = require('./mysql'); 
console.log(mysql.query('SELECT * FROM tablename')); 

爲得到一個結果出發這樣涉及undefined作爲輸出。 我該如何解決這個問題?

請注意,當我只輸入console.log(rows[0].id)而不是return rows[0].id時,它會發回123

在此先感謝!

+0

您需要提供一個回調。 – Scimonster

+0

@Scimonster,你會更詳細嗎? – user3821280

回答

2

在您的示例中,輸出將返回到數據庫查詢的匿名函數,而不是模塊的調用方。您可以使用回調將輸出返回給模塊的調用者。

exports.query = function(request, callback){ 
    conn.query(request, function(err, rows, fields){ 
     if (err) { 
      callback(err); 
     } else { 
      callback(null, rows[0].id); 
     } 
    }); 
} 

然後調用它像

var mysql = require('./mysql'); 
mysql.query('SELECT * FROM tablename', function(err, results){ 
    if (err) { 
     console.error(err); 
    } else { 
     console.log(results); 
    } 
}); 
+0

非常感謝!但是,爲什麼你將null設置爲'callback(null,rows [0] .id)' – user3821280

+0

這是一個常見的約定,回調的第一個參數是爲一個錯誤保留的,所以既然else沒有錯誤,在錯誤位置返回'null'。或者,您可以只執行'callback(err,rows [0] .id);''沒有'err'檢查。 –

0

這是同步的問題。

conn.query函數返回undefined,因爲它在獲取結果之前完成它的執行(就像js/node上幾乎所有的I/O相關操作)。

一個可能的解決方案是,爲您的query函數提供回調。

exports.query = function(request, cb){ 
    conn.query(request, function(err, rows, fields){ 
    // some "special" processing 
    cb(err, rows, fields); 
    }); 
}; 

如果你不熟悉異步功能,承擔有關的一些文章一看:

http://justinklemm.com/node-js-async-tutorial/ https://www.promisejs.org/