这个Javascript“要求”是什么?


504

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

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。那是什么意思 我查看了目录,但没有找到文件pg。它放在哪里,以及Javascript如何找到它?


45
require不是javascript的一部分,它是在nodejs中使用的关键字。nodejs不是您使用的客户端DOM。因此,可能与nodejs一起使用的脚本可能无法在浏览器中使用。您可以在nodejs中调用window或document吗?否,与浏览器的要求相同。
mpm 2012年

8
如何更改上面的代码,使其可以在浏览器中使用?
Neurocercer 2012年

8
您不能直接从网页与Pg交谈;您需要能够打开一个普通的tcp / ip套接字,您可以通过该套接字发送和接收二进制数据,并且没有任何网络浏览器允许您这样做。您所引用的库是node.js的扩展,因此无法在客户端JavaScript中使用。我强烈建议您通过Web服务器和JSON请求/回复从客户端与PostgreSQL服务器通信。
克雷格·林格

1
我在本地运行PostgreSQL。我需要为网络服务器安装什么?
Neuromancer 2012年

1
节点?这是一个非常不错的Web服务器,或者可以是一个本地安装的服务器。
蒂莫西·米德

Answers:


871

那么这是什么“要求”?

require()不是标准JavaScript API的一部分。但是在Node.js中,它是一个内置函数,具有特殊目的:加载模块

模块是一种将应用程序拆分为单独文件的方法,而不是将所有应用程序都包含在一个文件中。其他语言在语法和行为上也有细微差别,例如C include,Python import等等,也存在该概念。

Node.js模块和浏览器JavaScript之间的最大区别是如何从另一个脚本的代码访问一个脚本的代码。

  • 在浏览器JavaScript中,脚本是通过<script>元素添加的。当它们执行时,它们都可以直接访问全局范围,即所有脚本之间的“共享空间”。任何脚本都可以在全局范围内自由定义/修改/删除/调用任何内容。

  • 在Node.js中,每个模块都有自己的作用域。一个模块不能直接访问另一个模块中定义的内容,除非它选择公开它们。要公开模块中的内容,必须将其分配给exportsmodule.exports。要使一个模块访问另一个模块的exportsmodule.exports必须使用require()

在您的代码中,var pg = require('pg');加载pg模块,即Node.js的PostgreSQL客户端。这使您的代码可以通过pg变量访问PostgreSQL客户端API的功能。

为什么它在节点中有效但在网页中无效?

require()module.exportsexports是一个模块系统特定于Node.js的的API的 浏览器未实现此模块系统。

另外,在我让它在节点上工作之前,我必须做npm install pg。那是什么意思

NPM是一个软件包存储库服务,用于承载已发布的JavaScript模块。npm install是一个命令,可让您从其存储库中下载软件包。

它放在哪里,以及Javascript如何找到它?

npm cli将所有下载的模块放在node_modules您运行的目录中npm install。Node.js拥有关于模块如何查找其他模块的非常详细的文档,包括查找node_modules目录。



2
为什么Node.js需要此功能?
Melab

23
@Melab,因为一旦代码膨胀到比大学编码更大的规模,并且需要超过1个人参与,就需要模块化。这就是为什么我们一直以来都在使用它们
David Tonhofer

3
PHP中的等效项是include/require[_once]php.net link),不是use,这是一个别名关键字。
nevvermind

107

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

Javascript是一种传统上仅限于Web浏览器的语言,具有有限的全局上下文,该上下文主要由后来称为文档对象模型(DOM)级别0(Netscape Navigator Javascript API)定义。

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

现在require()是定义为CommonJS规范一部分的特殊函数调用。在node中,它解析Node搜索路径中的库和模块,现在通常将其定义node_modules在同一目录(或调用的javascript文件的目录)或系统范围的搜索路径中。

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

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

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

2
这令人困惑...方法createServer令人困惑...它表明我可以随时随地随意创建服务器...与WAMP范式进行对比:大约5年前,我安装了(例如, ')我的WindowsXP笔记本电脑上的一台服务器,从那以后我就再也没有“创建过”另一台服务器了……现在突然间我可以开始创建服务器了……这真是令人困惑
。– dsdsdsdsd

以及什么是“表达”……当我搜索C:\Program Files\nodejs\ 名为的文件或目录时express,我没有找到匹配项……它是从哪里来的?
dsdsdsdsd

1
Express是中间件和框架的集合,可简化在node.js中创建Web服务器的过程,您需要使用进行安装npm。您可以在此处找到更多信息:expressjs.com
Timothy Meade

很好的解释。我有一个问题是否要求在环境NodeJS和浏览器上都使用动态路径?
M.Abulsoud

29

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

在文件中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

9
如果您尝试在网页中使用该怎么办?
Neuromancer 2012年

1
我正在尝试将以上内容加载到网页中!
Neuromancer 2012年

7
第一个代码块是否应该在名为circle_object.js的文件中?
user1416227 2014年

24

我注意到,尽管其他答案解释了要求是什么,并且该答案用于在Node中加载模块,但它们并未对在浏览器中工作时如何加载节点模块给出完整的答复。

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

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

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

现在,整个脚本将被加载到页面中-因此您可以直接访问其变量和方法。

在大型项目中还有其他更广泛使用的方法,例如require.js之类的模块加载器。在这两个中,我没有使用Require self,但是我认为许多人认为它是可行的方法。


您只需要转到项目文件夹的根目录,然后键入npm install <模块名称>。例如,如果键入npm install bootstrap,它将把引导程序安装到名为node_modules / bootstrap的目录中。现在,您可以如上所述将引导程序加载到您的应用程序中。您将需要安装node和npm才能明显使用它。如果您需要更多信息,请给出错误信息。
山姆·雷德威

<name of module>?这是我的目录结构。根文件夹为xyzxyz/index.html指向xyz/js/scripts.js使用script tagxyz/js/scripts.js有代码require('./module1.js');require('./module2.js');module1.js/ module2.js也位于xyz/js文件夹中。现在,如何使scripts.js浏览器可用?
17:56进行过度兑换

16

您知道在浏览器中运行JavaScript时如何访问“窗口”或“数学”等变量吗?您不必声明这些变量,而是已编写它们供您随时使用。

好吧,当您在Node.js环境中运行文件时,可以使用一个变量。它称为“模块”。它是一个对象。它具有一个称为“出口”的属性。它是这样的:

在我们将其命名为example.js的文件中,您将编写:

example.js

module.exports = "some code";

现在,您希望将此字符串“某些代码”存储在另一个文件中。

我们将另一个文件命名为otherFile.js

在此文件中,您编写:

otherFile.js

let str = require('./example.js')

该require()语句转到您放入其中的文件,查找存储在module.exports属性中的所有数据。代码的let str = ...部分意味着将require语句返回的任何内容存储到str变量中。

因此,在此示例中,最终结果是在otherFile.js中,您现在有了以下代码:

let string =“某些代码”;

  • 要么 -

让str =('./example.js').module.exports

注意:

在require语句中写入的文件名:如果是本地文件,则应为example.js的文件路径。另外,.js扩展名是默认添加的,因此我不必编写它。

当需要诸如Express之类的node.js库时,您可以执行类似的操作。在express.js文件中,有一个名为“模块”的对象,其对象名为“ exports”。

因此,它看起来像是沿着这些思路,在后台(我有些是初学者,所以其中一些细节可能并不准确,但这只是为了展示这个概念:

express.js

module.exports = function() {
    //It returns an object with all of the server methods
    return {
        listen: function(port){},
        get: function(route, function(req, res){}){}
     }
}

如果需要模块,则如下所示:const moduleName = require(“ module-name”);

如果您需要本地文件,则如下所示:const localFile = require(“ ./ path / to / local-file”);

(注意文件名开头的./)


还要注意,默认情况下,导出是一个对象。例如,module.exports = {}因此,您可以在为module.exports赋值之前编写module.exports.myfunction =()=> {}。但是您也可以通过编写module.exports =“我不再是对象了”来替换该对象。


6

两种形式的module.exports /要求:

(请参阅此处

风味1
导出文件(misc.js):

var x = 5;
var addX = function(value) {
  return value + x;
};
module.exports.x = x;
module.exports.addX = addX;

其他档案:

var misc = require('./misc');
console.log("Adding %d to 10 gives us %d", misc.x, misc.addX(10));

风味2
导出文件(user.js):

var User = function(name, email) {
  this.name = name;
  this.email = email;
};
module.exports = User;

其他档案:

var user = require('./user');
var u = new user();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.