这是什么Javascript“要求”?

我试图让Javascript读/写PostgreSQL数据库。 我在github上find了这个项目 。 我能够得到以下示例代码在节点中运行。

var pg = require('pg'); //native libpq bindings = `var pg = require('pg').native` var conString = "tcp://postgres:1234@localhost/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 。 那是什么 我看了目录,并没有find一个文件页。 它把它放在哪里,Javascript如何find它?

require()不是你的标准JavaScript的一部分。 在你的问题和标签的上下文中, require()被构build到Node.js中以加载模块 。 这个概念类似于C / Java / Python / [在这里插入更多的语言]import或包含。

模块的概念类似于通过<script>标签添加less量JavaScript代码。 与添加<script>标记不同,它不会将文件泄漏到全局范围中。 该文件有其自己的范围,基本上包含您在该文件中定义的所有内容,除非您决定公开function。 require返回一个值,具体取决于模块使用exportsmodule.exports公开的module.exports 。 另一篇文章解释了require()如何与exports一起工作。

在你的代码中,它加载了pg模块,我猜是NodeJS的PostgreSQL驱动程序。 你做npm install pg的部分从npm(一个NodeJS模块的包存储库)下载pg模块,并通过require('pg');使它可用于你的项目require('pg');


以防万一你想知道为什么我提到“在你的问题上下文”,有第三方库也使用一个名为require做一些事情。 识别哪一个是方便的。

  • RequireJS公开了一个名为require的函数,并define了在运行提供的代码之前加载依赖关系。 语法是AMD格式。

  • Neuter连接了js文件,也暴露了一个名为require的函数。 这个更接近于PHP的import

  • Browserify在浏览器上使用require ,允许浏览器上的脚本被写成NodeJS风格(CommonJS模块语法)。

好吧,让我们首先从Web浏览器中的 Javascript和服务器上的 Javascript(CommonJS和Node)之间区分开来。

Javascript是一种传统上局限于Web浏览器的语言,主要由被称为文档对象模型(DOM)0级(Netscape Navigator JavaScript API)的有限全局环境定义。

服务器端Javascript消除了这种限制,并允许JavaScript调用各种本地代码(如Postgres库)和打开套接字。

现在require()是一个特殊的函数调用,定义为CommonJS规范的一部分。 在节点中,它parsing节点searchpath中的库和模块,现在通常在同一目录(或调用的JavaScript文件的目录)或系统范围的searchpath中定义为node_modules

要尝试回答您的问题的其余部分,我们需要在浏览器中运行的代码和数据库服务器之间使用代理。

由于我们正在讨论Node,并且您已经熟悉如何从那里运行查询,所以使用Node作为代理是有意义的。

作为一个简单的例子,我们将创build一个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'); 

它用于加载模块。 我们用一个简单的例子。

在文件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()方法用于加载和cachingJavaScript模块。 因此,如果您想要将本地相关JavaScript模块加载到Node.js应用程序中,则可以简单地使用require()方法。

例:

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

我注意到,虽然其他答案解释了什么是需要的,并且它用于在Node中加载模块,但是在浏览器中工作时如何加载节点模块没有给出完整的答复。

这样做很简单。 如您所描述的那样使用npm来安装模块,而模块本身将位于通常称为node_modules的文件夹中。

现在将它加载到你的应用程序的最简单的方法是从你的html引用它的脚本标记指向这个目录。 即,如果您的node_modules目录位于与index.html相同级别的项目根目录下,则可以在index.html中编写该目录:

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

整个脚本现在将被加载到页面中 – 所以你可以直接访问它的variables和方法。

还有其他的方法在更大的项目中被广泛使用,比如像require.js这样的模块加载器。 在这两者中,我并没有使用自己的要求,但我认为这是很多人认为要走的道路。