2014-03-07 86 views
2

我是Node.js的新手,所以這可能是一個基本問題,我錯過了一些明顯的東西。在下面的代碼中,我試圖從foo中設置sql_file的名字,但由於該變量不起作用,我不斷收到文件不存在的錯誤。如果我在sql_util.js中硬編碼文件名,它可以正常工作。Node.JS module.exports用於在兩個函數之間傳遞參數?

那麼如何將參數或任何對象從一個js文件傳遞到另一個js文件的函數?

foo.js

var misc = require('./sql_get'); 
console.log(misc.sql_file("on.sql")); 

sql_util.js

fs = require('fs'); 
file = 'on.sql' 
function sql_file(cb) { 
    var fileName = "./SQLs/" + sql_file; 
    fs.readFile(fileName, function(err, buffer) { 
     if (err) return cb(err); 
     return cb(null, buffer.toString()); 
    }); 
} 
sql_file(function(err, sqlstatement) { 
    if (err) throw err; 
    console.log('sql statement is: ' + sqlstatement); 
}); 
}; 
module.exports.x = x; 
module.exports.sql_fil = sql_file; 
+1

怎麼使用*「周圍的變量/屬性名稱S' –

+0

假設爲粗體。謝謝 – justZito

+0

此代碼充滿了拼寫錯誤,未定義的變量引用和不正確的文件名。我建議首先清理代碼,看看它是否有效,然後擔心參數傳遞。 – Brandon

回答

3

讓我們一行一行仔細閱讀,因爲我看到很多錯誤,包括語法和語義。

foo.js

var misc = require('./sql_get'); 
console.log(misc.sql_file("on.sql")); 

您在函數中定義如下sql_file是異步的,所以它不會返回一個值,但需要其將結果傳遞給回調。

sql_util.js

fs = require('fs'); 
file = 'on.sql' 

你有一個未使用的模塊,全局變量file。刪除這個。這會造成混亂。

function sql_file(cb) { 
    var fileName = "./SQLs/" + sql_file; 

sql_file是函數。我可以告訴,因爲這段代碼存在於一個名爲sql_file的函數中。因此,fileName將是「./SQLs/」+該函數的結果,即函數的來源.toString()。我想也許你想要一個參數?

fs.readFile(fileName, function(err, buffer) { 
     if (err) return cb(err); 
     return cb(null, buffer.toString()); 
    }); 
} 

這似乎沒問題。

sql_file(function(err, sqlstatement) { 
    if (err) throw err; 
     console.log('sql statement is: ' + sqlstatement); 
    }); 
}; 

我不確定你要在這裏做什麼。你爲什麼要調用這個函數?

module.exports.x = x; 
module.exports.sql_fil = sql_file; 

這兩條線都有問題。沒有定義名爲x的符號。我很驚訝這段代碼運行時沒有在該行上拋出錯誤。其次,您輸出sql_filesql_fil,缺少字母e。

解決方案

既然你問的是參數傳遞,你只需要一個單一的功能,讓我們簡化這一點。你永遠不想使用全局變量。如果一個函數需要一個特定的變量,只需將它作爲參數傳遞即可。

foo.js

var misc = require('./sql_get'); 
misc.sql_file('on.sql', function (err, contents) { 
    console.log(contents); 
}); 

sql_get.js(注意,文件重命名)

var fs = require('fs'); 

function sql_file(sqlFilename, cb) { 
    var fileName = "./SQLs/" + sqlFilename; 
    fs.readFile(fileName, function(err, buffer) { 
     if (err) return cb(err); 
     return cb(null, buffer.toString()); 
    }); 
} 

module.exports.sql_file = sql_file; 
+0

Brandon,我來自一個Visual Basic世界,它就是這樣一條學習曲線,我一直在閱讀Node.ja in Action,這很好,但有點過頭了。今天我有Sams學習Node.Js。真的,它指出了我需要關注的基本原理。我只在js工作了一週左右,所以你的反饋很棒,謝謝你花時間!它有任何其他好的文獻或練習,你可以推薦我會很感激..再次感謝 – justZito

+0

當然。特別是JavaScript和node.js是單線程的,縮放併發的技巧是帶有回調的異步I/O。我建議學習回調,因爲在VB中可能沒有暴露。 – Brandon

+0

這是一個很好的解釋 - 謝謝! – MonsterWimp757

3

的幾個問題:

  1. 你需要sql_get但命名其他文件sql_util

    var misc = require('./sql_util'); 
    
  2. 您正在輸出module.exports.sql_fil = sql_file;(查看缺失的e)。你可能是指;

    module.exports.sql_file = sql_file; 
    
  3. 在呼籲sql_file,要傳遞一個字符串,但預計在函數自身的CB -

    misc.sql_file("on.sql", function(err, fileContent) { 
        if(err) return console.log(err); 
        console.log('File content: ', fileContent); 
    }); 
    
    function sql_file(sqlFileName, cb) { 
        var fileName = "./SQLs/" + sqlFileName; 
        fs.readFile(fileName, function(err, buffer) { 
         if (err) return cb(err); 
         return cb(null, buffer.toString()); 
        }); 
    } 
    

而且我不知道你是用呼喚sql_file功能做什麼在該文件本身。刪除。

+0

我想把回調放到var reader = connection.reader(「SELECT * FROM ON」,[])中,以保持代碼整潔,因此它看起來像connection.reader(sql_file(「on.sql」))。讀取原始的sql文件並使用sql文件中的select right。 – justZito