2012-03-28 64 views
299

我試圖讓Javascript讀/寫PostgreSQL數據庫。我在github上發現了這個project。我能夠得到以下示例代碼在節點中運行。什麼是Javascript的「要求」?

var pg = require('pg'); //native libpq bindings = `var pg = require('pg').native` 
var conString = "tcp://postgres:[email protected]/postgres"; 

var client = new pg.Client(conString); 
client.connect(); 

//queries are queued and executed one after another once the connection becomes available 
client.query("CREATE TEMP TABLE beatles(name varchar(10), height integer, birthday timestamptz)"); 
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", ['Ringo', 67, new Date(1945, 11, 2)]); 
client.query("INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", ['John', 68, new Date(1944, 10, 13)]); 

//queries can be executed either via text/parameter values passed as individual arguments 
//or by passing an options object containing text, (optional) parameter values, and (optional) query name 
client.query({ 
    name: 'insert beatle', 
    text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)", 
    values: ['George', 70, new Date(1946, 02, 14)] 
}); 

//subsequent queries with the same name will be executed without re-parsing the query plan by postgres 
client.query({ 
    name: 'insert beatle', 
    values: ['Paul', 63, new Date(1945, 04, 03)] 
}); 
var query = client.query("SELECT * FROM beatles WHERE name = $1", ['John']); 

//can stream row results back 1 at a time 
query.on('row', function(row) { 
    console.log(row); 
    console.log("Beatle name: %s", row.name); //Beatle name: John 
    console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates 
    console.log("Beatle height: %d' %d\"", Math.floor(row.height/12), row.height%12); //integers are returned as javascript ints 
}); 

//fired after last row is emitted 
query.on('end', function() { 
    client.end(); 
}); 

接下來我試圖讓它在網頁上運行,但似乎沒有發生任何事情。我檢查了Javascript控制檯,它只是說「不需要定義」。

那麼這是什麼「要求?」爲什麼它在節點中工作,而不是在網頁中工作?

而且,之前我把它在節點的工作,我不得不這樣做npm install pg。那是什麼?我在目錄中查找並沒有找到一個文件頁。它把它放在哪裏,Javascript如何找到它?

+14

require不是javascript的一部分,它是nodejs中使用的關鍵字。 nodejs不是您使用客戶端的DOM。因此,可能適用於nodejs的腳本可能無法在瀏覽器中使用。你可以在nodejs中調用window或document嗎?不,與瀏覽器要求相同。 – mpm 2012-03-28 05:15:25

+5

如何更改上面的代碼,以便它可以在瀏覽器中工作? – neuromancer 2012-03-28 05:25:08

+6

你不能直接從網頁與Pg交談;你需要能夠打開一個簡單的TCP/IP套接字,你可以發送和接收二進制數據,而且沒有網頁瀏覽器會讓你這樣做。您所指的庫是node.js的擴展,並且不適用於客戶端JavaScript。我強烈建議您通過Web服務器和JSON請求/回覆從客戶端與您的PostgreSQL服務器通信。 – 2012-03-28 05:44:51

回答

511

require()不是您的標準JavaScript的一部分。在您的問題和標籤的背景下,require()內置到Node.js中以加載模塊。這個概念類似於C/Java/Python/[在此處插入更多語言]的導入或包含。

模塊的概念類似於經由<script>標記只是添加的JavaScript代碼小比特。與添加<script>標籤不同,它不會將文件泄漏到全局範圍中。該文件有其自己的作用域,基本上包含您在該文件中定義的所有內容,除非您決定公開功能。 require會返回一個值,具體取決於模塊使用的內容exportsmodule.exportsAnother post解釋了require()如何與exports一起使用。  

在你的代碼中,它加載了pg模塊,我猜是NodeJS的PostgreSQL驅動程序。你所做的部分npm install pg從npm(NodeJS模塊的包存儲庫)下載pg模塊,並通過require('pg');將其提供給您的項目。


萬一你想知道我爲什麼「在上下文中你的問題」中提到,有一些還可以使用一個名爲require做一些功能的第三方庫。識別哪個是哪個方便很方便。

  • RequireJS公開了一個稱爲require功能,具有沿define運行提供的代碼之前加載的依賴關係。語法是AMD格式。

  • Neuter,它連接js文件,也暴露了一個名爲require的函數。這個更接近於PHP的import

  • Browserify在瀏覽器上使用require,允許瀏覽器上的腳本寫成NodeJS風格(CommonJS模塊語法)。

+9

我認爲[WebPack也有自己的'require'支持](https://webpack.github.io/docs/context.html)? – 2016-07-14 08:19:39

+0

爲什麼Node.js需要這個功能? – Melab 2017-10-04 14:58:41

+3

@Melab因爲一旦代碼膨脹到比大學編碼練習更大的事情並且開始涉及超過1人,就需要模塊化。這是[爲什麼我們一直在使用它們,就像永遠一樣](https://en.wikipedia.org/wiki/Mesa_(programming_language))。 – 2017-11-01 16:54:48

25

它用於加載模塊。我們用一個簡單的例子。

在文件circle_object.js

var Circle = function (radius) { 
    this.radius = radius 
} 
Circle.PI = 3.14 

Circle.prototype = { 
    area: function() { 
     return Circle.PI * this.radius * this.radius; 
    } 
} 

我們可以通過require使用,如:

node> require('circle_object') 
{} 
node> Circle 
{ [Function] PI: 3.14 } 
node> var c = new Circle(3) 
{ radius: 3 } 
node> c.area() 

require()方法用於加載和高速緩存的JavaScript模塊。因此,如果您想將本地相關JavaScript模塊加載到Node.js應用程序中,則可以簡單地使用require()方法。

例子:

var yourModule = require("your_module_name"); //.js file extension is optional 
+4

如果您嘗試在網頁中使用它,該怎麼辦? – neuromancer 2012-03-28 04:52:30

+1

我試圖讓上面的網頁加載! – neuromancer 2012-03-28 05:23:56

+6

第一個代碼塊應該放在名爲circle_object.js的文件中嗎? – user1416227 2014-07-09 04:21:08

82

好吧,讓我們先用一個服務器(CommonJS的和節點)上製作的Javascript 之間的區別在Web瀏覽器和Javascript 開始。

JavaScript是一種傳統上被限制在Web瀏覽器中的語言,主要由被稱爲文檔對象模型(DOM)0級(Netscape Navigator JavaScript API)定義的有限全局環境定義。

服務器端Javascript消除了這種限制,並允許JavaScript調用各種本地代碼塊(如Postgres庫)並打開套接字。

現在require()是一個特殊的函數調用,定義爲CommonJS規範的一部分。在節點中,它解析節點搜索路徑中的庫和模塊,現在通常在同一個目錄(或調用的JavaScript文件的目錄)或系統範圍的搜索路徑中定義爲node_modules

要嘗試回答您的其餘問題,我們需要在瀏覽器和數據庫服務器中運行的代碼之間使用代理。

由於我們正在討論Node,並且您已經熟悉如何從那裏運行查詢,因此將Node用作該代理是有意義的。

作爲一個簡單的例子,我們將製作一個URL,它返回一些關於甲殼蟲,給定名稱爲JSON的事實。

/* your connection code */ 

var express = require('express'); 
var app = express.createServer(); 
app.get('/beatles/:name', function(req, res) { 
    var name = req.params.name || ''; 
    name = name.replace(/[^a-zA_Z]/, ''); 
    if (!name.length) { 
     res.send({}); 
    } else { 
     var query = client.query('SELECT * FROM BEATLES WHERE name =\''+name+'\' LIMIT 1'); 
     var data = {}; 
     query.on('row', function(row) { 
      data = row; 
      res.send(data); 
     }); 
    }; 
}); 
app.listen(80, '127.0.0.1'); 
+0

這很混亂...... createServer的方法令人困惑......它暗示了我可以隨時隨地創建服務器,只要我想......與我的WAMP範例相對比:大約5年前,我安裝了(例如'創建')我的windowsXP筆記本電腦上的一臺服務器,而且我從來沒有'創建'過另一臺服務器,因爲......現在突然之間我可以開始創建服務器......它令人困惑...... – dsdsdsdsd 2016-02-24 14:37:04

+0

什麼是'express' ...當我在'C:\ Program Files \ nodejs \'中搜索名爲'express'的文件或目錄時,我沒有找到匹配...所以它來自哪裏... – dsdsdsdsd 2016-02-24 14:41:11

+1

Express是一個集合中間件和框架使得在node.js中創建Web服務器變得更加容易,您需要使用'npm'來安裝它。你可以在這裏找到更多的信息:http://expressjs.com/ – 2016-02-24 16:32:09

10

我注意到,而其他的答案解釋什麼需要是,它是用來加載在節點模塊,他們並沒有就如何在瀏覽器中工作時加載節點模塊的完整答覆。

這樣做很簡單。如您所描述的那樣使用npm安裝您的模塊,並且模塊本身將位於通常稱爲node_modules的文件夾中。

現在,將它加載到您的應用程序的最簡單方法是從您的HTML引用它與指向此目錄的腳本標記。也就是說,如果你的node_modules目錄是在項目的根在同一水平作爲您的index.html,你會在您的index.html這樣寫:

<script src="node_modules/ng"></script> 

這整個腳本會被裝載到頁面中 - 如此你可以直接訪問它的變量和方法。

還有其他方法更廣泛地用於大型項目中,例如像require.js這樣的模塊加載器。在這兩者中,我沒有使用自己的要求,但我認爲很多人都認爲這是要走的路。

+0

您只需轉到項目文件夾的根目錄並輸入npm install <模塊的名稱>。例如,如果您鍵入npm install bootstrap,它會將引導程序安裝到名爲node_modules/bootstrap的目錄中。如上所述,您現在可以將自舉程序加載到您的應用程序中。你需要安裝node和npm才能夠明顯地使用它。如果你需要更多的信息,請給出你得到的錯誤。 – 2016-05-15 08:38:53

+0

'<模塊名稱>'?這是我的目錄結構。根文件夾是'xyz'。 'xyz/index.html'使用'script tag'指向'xyz/js/scripts.js'。 'xyz/js/scripts.js'的代碼爲'require('./ module1.js'); require('./ module2.js');'。 'module1.js' /'module2.js'也在'xyz/js'文件夾中。現在,我如何讓瀏覽器可以使用'scripts.js'? – overexchange 2016-05-15 17:56:59