web-dev-qa-db-ja.com

このJavascriptは「必須」とは何ですか?

JavascriptにPostgreSQLデータベースへの読み書きをさせようとしています。私はこの プロジェクト をgithubで見つけました。次のサンプルコードをnodeで実行することができました。

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();
});

次に私はそれをWebページ上で動かそうとしましたが、何も起こらないようでした。 Javascriptコンソールで確認したところ、「require not defined」と表示されていました。

それで、これは何を「必要としますか」。なぜノードでは動作しますが、Webページでは動作しませんか。

また、nodeで動くようになる前に、私はnpm install pgをしなければなりませんでした。それは何ですか?ディレクトリを調べたところ、pgファイルが見つかりませんでした。それはどこに置いたのでしょうか、そしてJavascriptはそれをどのように見つけますか?

400
neuromancer

それで、これは何を「必要としますか」。

require() は標準のJavaScript APIの一部ではありません。しかしNode.jsでは、これは特別な目的を持った組み込み関数です: モジュールをロードするための

モジュールは、すべてのアプリケーションを1つのファイルにまとめるのではなく、アプリケーションを別々のファイルに分割する方法です。この概念は、Cのinclude、PHPのuse、Pythonのimportなど、構文や動作に多少の違いがある他の言語にもあります。

Node.jsモジュールとブラウザJavaScriptの大きな違いの1つは、あるスクリプトのコードに別のスクリプトのコードからアクセスする方法です。

  • ブラウザのJavaScriptでは、スクリプトは<script>要素を介して追加されます。それらが実行されると、それらはすべてグローバルスコープ、つまりすべてのスクリプト間の「共有スペース」に直接アクセスできます。どのスクリプトでも、グローバルスコープ上で自由に定義/変更/削除/呼び出すことができます。

  • Node.jsでは、各モジュールは独自のスコープを持ちます。公開することを選択しない限り、モジュールは他のモジュールで定義されたものに直接アクセスすることはできません。モジュールからものを公開するには、それらをexportsまたはmodule.exportsに割り当てる必要があります。モジュールが他のモジュールのexportsまたはmodule.exportsにアクセスするには、require()を使用する必要があります。

コード内で、var pg = require('pg');はNode.js用のPostgreSQLクライアントである pg モジュールをロードします。これはあなたのコードがpg変数を通してPostgreSQLクライアントのAPIの機能にアクセスすることを可能にします。

なぜノードでは動作しますが、Webページでは動作しませんか。

require()module.exportsおよびexportsは、Node.js固有のモジュールシステムのAPIです。ブラウザはこのモジュールシステムを実装していません。

また、nodeで動作させる前に、npm install pgを実行しなければなりませんでした。それは何ですか?

_ npm _ は、公開されたJavaScriptモジュールをホストするパッケージリポジトリサービスです。 npm install はリポジトリからパッケージをダウンロードすることを可能にするコマンドです。

それはどこに置いたのでしょうか、そしてJavascriptはそれをどのように見つけますか?

Node.jsには モジュールが他のモジュールを見つける方法についての非常に詳細なドキュメントがあります 。しかし、要点をまとめると、ダウンロードしたすべてのモジュールが、node_modulesを実行したディレクトリのnpm installに置かれます。

685
Joseph

それでは、まずはJavascript Webブラウザの場合とJavascript サーバーの場合(CommonJSおよびNode)を区別しましょう。

Javascriptは伝統的にWebブラウザに限定された言語であり、その大部分はDocument Object Model(DOM)レベル0(Netscape Navigator Javascript API)として知られるようになったことによって定義された、限定されたグローバルコンテキストです。

サーバーサイドのJavascriptはその制限を取り除き、Javascriptがさまざまなネイティブコード(Postgresライブラリなど)とオープンソケットを呼び出すことを可能にします。

require()はCommonJS仕様の一部として定義された特別な関数呼び出しです。 nodeでは、Node検索パス(通常は同じディレクトリ(または呼び出されたjavascriptファイルのディレクトリ)内のnode_modules)またはシステム全体の検索パスでライブラリおよびモジュールを解決します。

質問の残りの部分に答えるには、ブラウザで実行されているコードとデータベースサーバの間にプロキシを使用する必要があります。

ここではNodeについて説明していますが、そこからクエリを実行する方法には精通しているので、そのプロキシとしてNodeを使用することは意味があります。

簡単な例として、名前を指定すると、JSONとして、Beatleに関するいくつかの事実を返すURLを作成します。

/* 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');
99
Timothy Meade

モジュールをロードするために使用されます。簡単な例を使ってみましょう。

ファイル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
27

他の答えでは何が必要かを説明していますが、Nodeでモジュールをロードするために使用されていることに気付きました。

それはとても簡単です。説明したようにnpmを使用してモジュールをインストールします。モジュール自体は通常node_modulesというフォルダに配置されます。

今すぐあなたのアプリにそれをロードする最も簡単な方法は、このディレクトリを指すスクリプトタグであなたのhtmlからそれを参照することです。つまり、node_modulesディレクトリがindex.htmlと同じレベルのプロジェクトのルートにある場合は、index.htmlにこれを記述します。

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

そのスクリプト全体がページにロードされるようになります。そのため、その変数とメソッドに直接アクセスできます。

require.js のようなモジュールローダーのように、より大きなプロジェクトでもっと広く使われている他のアプローチがあります。 2つのうち、私はRequire自分自身を使用していませんが、私はそれが行く方法として多くの人々に考えられていると思います。

18
Sam Redway

ブラウザでJavaScriptを実行しているときに、 "window"やMathなどの変数にアクセスする方法を知っていますか。あなたはこれらの変数を宣言する必要はありません、それらはあなたが望むときはいつでも使うために書かれています。

Node.js環境でファイルを実行しているときには、使用できる変数があります。それは「モジュール」と呼ばれますそれはオブジェクトです。それは "輸出"と呼ばれる特性を持っています。そしてそれはこのように動作します:

Example.jsという名前のファイルに、次のように書きます。

example.js

module.exports = "some code";

さて、あなたは別のファイルにこの文字列 "some code"が欲しいのです。

他のファイルにotherFile.jsという名前を付けます。

このファイルに、次のように書きます。

otherFile.js

let str = require('example.js')

Require()ステートメントは、その中に入れたファイルにアクセスし、module.exportsプロパティに格納されているデータがすべて見つかります。コードのlet str = ...部分は、requireステートメントが返すものはすべてstr変数に格納されることを意味します。

したがって、この例では、結果はotherFile.jsに次のようになります。

string = "some code";とします。

  • または -

str =( './example.js').module.exportsとします。

注意:

require文の中に書かれているファイル名。ローカルファイルの場合は、example.jsへのファイルパスでなければなりません。また、.js拡張子がデフォルトで追加されているので、それを書く必要はありません。

Expressなど、node.jsライブラリが必要な場合も同様のことを行います。 express.jsファイルには、 'exports'という名前のプロパティを持つ 'module'という名前のオブジェクトがあります。

それで、それはボンネットの下で、これらの線に沿っているように見えます(私はやや初心者なので、これらの詳細のいくつかは正確でないかもしれません、しかしそれは概念を示すことです:

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( "./ local-file");

(ファイル名の先頭にある./に注意してください)

4
Maiya