Bu Javascript “gerektirir” nedir?


505

Bir PostgreSQL veritabanına okumak / yazmak için Javascript almaya çalışıyorum. Bu projeyi github'da buldum . Düğümde çalıştırmak için aşağıdaki örnek kodu almak mümkün.

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

Sonra bir web sayfasında çalışmasını sağlamaya çalıştım, ama hiçbir şey olmadı. Javascript konsolunda kontrol ettim ve sadece "tanımlanmadı" diyor.

Peki bu "ihtiyaç" nedir? Neden düğümde çalışıyor ancak bir web sayfasında çalışmıyor?

Ayrıca, düğümde çalışmaya başlamadan önce yapmam gerekiyordu npm install pg. Bu ne hakkında? Dizine baktım ve bir dosya bulamadım pg. Nereye koydu ve Javascript bunu nasıl buldu?


45
gerektiren javascript parçası değil, nodejs kullanılan bir anahtar kelimedir. nodejs, istemci tarafını kullandığınız DOM değildir. bu nedenle nodejs ile çalışabilecek bir komut dosyası tarayıcıda çalışmayabilir. Düğümlerde pencere veya belge arayabilir misiniz? Hayır, tarayıcı ile ihtiyaç için de aynı.
mpm

8
Bir tarayıcıda çalışması için yukarıdaki kodu nasıl değiştirebilirim?
nöromancer

8
Doğrudan bir web sayfasından Pg ile konuşamazsınız; ikili veri gönderip alabileceğiniz düz bir tcp / ip soketi açmanız gerekir ve hiçbir web tarayıcısı bunu yapmanıza izin vermez. Bahsettiğiniz kitaplık node.js için bir uzantıdır ve istemci JavaScript'inde çalışmaz. PostgreSQL sunucunuzla web sunucunuz ve JSON istekleriniz / yanıtlarınız aracılığıyla istemciden konuşmanızı önemle tavsiye ederim.
Craig Ringer

1
PostgreSQL'i yerel olarak çalıştırıyorum. Bir web sunucusu için neleri yüklemem gerekir?
nöromancer

1
Düğüm? Yerel olarak kurmak oldukça iyi bir web sunucusu veya biri olabilir.
Timothy Meade

Yanıtlar:


872

Peki bu "ihtiyaç" nedir?

require(), standart JavaScript API'sinin bir parçası değildir. Ancak Node.js'de, özel bir amaca sahip yerleşik bir işlevdir: modülleri yüklemek .

Modüller, tüm uygulamanızı tek bir dosyada kullanmak yerine bir uygulamayı ayrı dosyalara bölmenin bir yoludur. Bu kavram, C include, Python importve benzerleri gibi sözdizimi ve davranışta küçük farklılıklar bulunan diğer dillerde de mevcuttur .

Node.js modülleri ve tarayıcı JavaScript'i arasındaki büyük farklardan biri, bir komut dosyasının koduna başka bir komut dosyasının kodundan nasıl erişildiğidir.

  • Tarayıcı JavaScript'inde, komut dosyası <script>öğe aracılığıyla eklenir . Yürüttüklerinde, hepsinin küresel kapsama doğrudan erişimi vardır, tüm komut dosyaları arasında bir "paylaşılan alan". Herhangi bir komut dosyası, global kapsamdaki herhangi bir şeyi özgürce tanımlayabilir / değiştirebilir / kaldırabilir / çağırabilir.

  • Node.js'de her modülün kendi kapsamı vardır. Bir modül, açığa çıkarmayı seçmedikçe başka bir modülde tanımlanan şeylere doğrudan erişemez. Bir şeyleri bir modülden ortaya çıkarmak için, exportsveya öğelerine atanmaları gerekir module.exports. Bir modül başka modül en erişmeye için exportsya module.exports, o kullanmalıdırrequire() .

Kodunuzda, var pg = require('pg');yükler pgmodülü, Node.js. için PostgreSQL istemcisi Bu, kodunuzun pgdeğişken üzerinden PostgreSQL istemcisinin API'lerinin işlevselliğine erişmesini sağlar .

Neden düğümde çalışıyor ancak bir web sayfasında çalışmıyor?

require(), module.exportsVe exportsbelirli bir Node.js. olan bir modülü sisteminin Apı'lerinin Tarayıcılar bu modül sistemini uygulamamaktadır.

Ayrıca, düğümde çalışmaya başlamadan önce yapmam gerekiyordu npm install pg. Bu ne hakkında?

NPM , yayınlanan JavaScript modüllerini barındıran bir paket veri havuzu hizmetidir. npm installpaketleri depolarından indirmenize izin veren bir komuttur.

Nereye koydu ve Javascript bunu nasıl buldu?

Npm cli indirilen tüm modülleri node_moduleskoştuğunuz bir dizine koyar npm install. Node.js, modüllerin bir node_modulesdizin bulmayı içeren diğer modülleri nasıl bulduğuna dair çok ayrıntılı belgelere sahiptir .



2
Node.js neden bu işlevselliğe ihtiyaç duyar?
Melab

23
@Melab Çünkü kod bir üniversite kodlama alıştırmasından daha büyük bir şeye uçurur ve 1'den fazla kişiyi dahil etmeye başlar başlamaz modülerleştirme gereklidir. Bu yüzden onları sonsuza dek kullandığımızdan beri kullanıyoruz .
David Tonhofer

3
PHP'deki eşdeğeri , bir takma ad anahtar kelimesi olan include/require[_once]( php.net bağlantısı ) olur . use
nevvermind

107

Pekala, önce bir web tarayıcısında Javascript ile bir sunucudaki Javascript (CommonJS ve Node) arasında ayrım yapmaya başlayalım .

Javascript, çoğunlukla Belge Nesne Modeli (DOM) düzey 0 (Netscape Navigator Javascript API) olarak bilinen, genel olarak sınırlı bir genel bağlamı olan bir web tarayıcısı ile sınırlı bir dildir.

Sunucu tarafındaki Javascript bu kısıtlamayı ortadan kaldırır ve Javascript'in çeşitli yerel kod parçalarına (Postgres kütüphanesi gibi) ve yuvaları açmasına izin verir.

Şimdi require()CommonJS spesifikasyonunun bir parçası olarak tanımlanan özel bir fonksiyon çağrısıdır. Düğümde, Düğüm arama yolundaki, artık genellikle node_modulesaynı dizinde (veya çağrılan javascript dosyasının dizininde) veya sistem genelinde arama yolunda tanımlanan kütüphaneleri ve modülleri çözer .

Sorunuzun geri kalanını yanıtlamaya çalışmak için, tarayıcıda çalışan kod ile veritabanı sunucusu arasında bir proxy kullanmamız gerekir.

Düğümü tartıştığımız ve oradan bir sorgunun nasıl çalıştırılacağını zaten bildiğiniz için Düğümü bu proxy olarak kullanmak mantıklı olacaktır.

Basit bir örnek olarak, JSON olarak bir ad verilen bir Beatle hakkında birkaç gerçek döndüren bir URL yapacağız.

/* 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
kafa karıştırıcı ... yöntem createServerkafa karıştırıcı ... her zaman dilediğim gibi sunucuları tek tek oluşturabileceğimi gösteriyor, ne zaman istersem ... bunu WAMP paradigmamla karşılaştır: yaklaşık 5 yıl önce kurdum (ör. ') benim windowsXP laptop bir sunucu, ve ben asla' başka bir sunucu oluşturmadım beri ... şimdi aniden ben sadece sunucular oluşturmaya başlayabilirsiniz ... kafa karıştırıcı ..
dsdsdsdsd

ve 'ekspres' nedir ... C:\Program Files\nodejs\ adlı bir dosya veya dizini expressaradığımda, bir eşleşme almıyorum ... bu yüzden nereden geliyor ...
dsdsdsdsd

1
Express, node.js'de bir web sunucusu oluşturmayı kolaylaştıran bir ara katman yazılımı ve çerçeve koleksiyonudur, yüklemeniz gerekir npm. Daha fazla bilgiyi burada bulabilirsiniz: expressjs.com
Timothy Meade

Bu çok iyi bir açıklama. Her iki ortamda NodeJS ve tarayıcı dinamik yolları ile çalışma gerektirir bir sorum var?
M.Abulsoud

29

Modülleri yüklemek için kullanılır. Basit bir örnek kullanalım.

Dosyada 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;
    }
}

Bunu şu şekilde kullanabiliriz require:

node> require('circle_object')
{}
node> Circle
{ [Function] PI: 3.14 }
node> var c = new Circle(3)
{ radius: 3 }
node> c.area()

require()Yöntem yük ve önbellek JavaScript modüllerinin için kullanılır. Dolayısıyla, bir Node.js uygulamasına yerel, göreceli bir JavaScript modülü yüklemek istiyorsanız, require()yöntemi kullanabilirsiniz .

Misal:

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

9
Ya bir web sayfasında kullanmaya çalışıyorsanız?
nöromancer

1
Bir web sayfasına yüklemek için yukarı almaya çalışıyorum!
nöromancer

7
İlk kod bloğunun circle_object.js adlı bir dosyada olması gerekiyor mu?
user1416227

24

Diğer cevapların ne gerekliliğini açıkladığını ve Düğümde modülleri yüklemek için kullanıldığını, ancak Tarayıcıda çalışırken düğüm modüllerinin nasıl yükleneceği konusunda tam bir cevap vermediklerini fark ettim.

Yapması oldukça basit. Modülünüzü açıkladığınız şekilde npm kullanarak kurun ve modülün kendisi genellikle node_modules adı verilen bir klasörde bulunur.

Şimdi uygulamanıza yüklemenin en basit yolu, html'nizden bu dizini işaret eden bir komut dosyası etiketi ile başvurmaktır. yani node_modules dizininiz projenin kök dizininde index.html ile aynı düzeydeyse bunu index.html dosyasına yazarsınız:

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

Bu komut dosyasının tamamı artık sayfaya yüklenecek; böylece değişkenlerine ve yöntemlerine doğrudan erişebilirsiniz.

Requir.js gibi bir modül yükleyici gibi daha büyük projelerde daha yaygın olarak kullanılan başka yaklaşımlar da vardır . İkisinden kendim için talep etmedim, ama bence birçok kişi tarafından gitmenin bir yolu var.


Proje klasörünüzün kök dizinine gitmeniz ve npm install <modül adı> yazmanız yeterlidir. Örneğin, npm install bootstrap yazarsanız, node_modules / bootstrap adlı bir dizine bootstrap yükler. Artık uygulamanıza yukarıda açıklanan şekilde bootstrap yükleyebilirsiniz. Açıkça kullanabilmek için düğüm ve npm kurulu olmalıdır. Daha fazla bilgiye ihtiyacınız varsa lütfen aldığınız hatayı verin.
Sam Redway

<name of module>? İşte benim dizin yapısı. Kök klasör xyz. xyz/index.htmlişaret xyz/js/scripts.jskullanılarak script tag. xyz/js/scripts.jskodu var require('./module1.js');require('./module2.js');. module1.js/ module2.jsDa vardır xyz/jsklasöre. Şimdi, scripts.jstarayıcıya nasıl erişebilirim?
1616'da

16

Tarayıcıda JavaScript çalıştırdığınızda, "pencere" veya Matematik gibi değişkenlere nasıl erişebildiğinizi biliyor musunuz? Bu değişkenleri bildirmek zorunda değilsiniz, istediğiniz zaman kullanabilmeniz için yazılmıştır.

Node.js ortamında bir dosya çalıştırdığınızda, kullanabileceğiniz bir değişken vardır. Buna "modül" denir. Bu bir nesnedir. "İhracat" adı verilen bir özelliği vardır. Ve şu şekilde çalışır:

Example.js olarak adlandıracağımız bir dosyaya şunu yazarsınız:

example.js

module.exports = "some code";

Şimdi, bu dizenin başka bir dosyada "bazı kodlar" olmasını istiyorsunuz.

Diğer dosyaya otherFile.js adını vereceğiz

Bu dosyaya şunu yazın:

otherFile.js

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

Bu () ifadesi içine koyduğunuz dosyaya gider, module.exports özelliğinde depolanan verileri bulur. Kodunuzun let str = ... kısmı, ifade dönüşleri gerektiren her şeyin str değişkenine kaydedildiği anlamına gelir.

Yani, bu örnekte, sonuç diğer otherfile.js dosyasında artık şuna sahip olmanızdır:

let string = "bazı kodlar";

  • veya -

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

Not:

requir deyiminin içine yazılan dosya adı: Yerel bir dosyaysa, example.js dosyasının dosya yolu olmalıdır. Ayrıca, .js uzantısı varsayılan olarak eklenir, bu yüzden yazmak zorunda kalmadım.

Express gibi node.js kütüphanelerine ihtiyaç duyduğunuzda benzer bir şey yaparsınız. Express.js dosyasında, 'export' adlı bir özelliğe sahip 'module' adlı bir nesne vardır.

Yani, bu çizgiler boyunca, kaputun altında bir şey gibi görünüyor (Ben biraz acemiyim, bu yüzden bazı detaylar tam olmayabilir, ancak konsepti göstermek için:

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){}){}
     }
}

Bir modül gerekiyorsa, şuna benzer: const moduleName = requir ("module-name");

Yerel bir dosya gerekiyorsa, şöyle görünür: const localFile = requir ("./ path / to / local-file");

(dosya adının başındaki ./ işaretine dikkat edin)


Ayrıca varsayılan olarak dışa aktarmanın bir nesne olduğunu unutmayın. Örn. Module.exports = {} Böylece module.exports'a bir değer atamadan önce module.exports.myfunction = () => {} yazabilirsiniz. Ancak, module.exports = "Artık bir nesne değilim" yazarak da nesneyi değiştirebilirsiniz.


6

Modülün iki çeşidi. İhracat / gerektirir:

( buraya bakın )

Lezzet 1
dışa aktarma dosyası (misc.js):

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

diğer dosya:

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

Lezzet 2
dışa aktarma dosyası (user.js):

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

diğer dosya:

var user = require('./user');
var u = new user();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.