2012-03-28 94 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