这是什么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
返回一个值,具体取决于模块使用exports
或module.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这样的模块加载器。 在这两者中,我并没有使用自己的要求,但我认为这是很多人认为要走的道路。