Apa yang dibutuhkan oleh Javascript ini?

506

Saya mencoba membuat Javascript untuk membaca / menulis ke database PostgreSQL. Saya menemukan proyek ini di github. Saya bisa mendapatkan kode sampel berikut untuk dijalankan di 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();
});

Selanjutnya saya mencoba membuatnya berjalan di halaman web, tetapi sepertinya tidak ada yang terjadi. Saya memeriksa konsol Javascript dan hanya mengatakan "tidak perlu didefinisikan."

Jadi apa yang "dibutuhkan?" Mengapa ia bekerja di simpul tetapi tidak di laman web?

Juga, sebelum saya bisa bekerja di node, saya harus melakukannya npm install pg. Tentang apa itu? Saya mencari di direktori dan tidak menemukan file pg. Di mana ia meletakkannya, dan bagaimana Javascript menemukannya?

ahli saraf
sumber
46
butuhkan bukan bagian dari javascript, itu adalah kata kunci yang digunakan dalam nodejs. nodejs bukan DOM yang Anda gunakan sisi klien. jadi skrip yang mungkin bekerja dengan nodejs mungkin tidak berfungsi di browser. Bisakah Anda memanggil jendela atau dokumen dalam nodejs? tidak, sama saja dengan persyaratan dengan browser.
mpm
8
Bagaimana cara mengubah kode di atas sehingga akan berfungsi di browser?
neuromancer
8
Anda tidak dapat berbicara dengan Pg langsung dari halaman web; Anda harus dapat membuka soket tcp / ip biasa yang dapat Anda kirim dan terima data biner, dan tidak ada peramban web yang memungkinkan Anda melakukannya. Pustaka yang Anda maksud adalah ekstensi untuk node.js dan tidak akan berfungsi dalam JavaScript klien. Saya sangat menyarankan Anda berbicara dengan server PostgreSQL Anda dari klien melalui server web Anda dan permintaan / balasan JSON.
Craig Ringer
1
Saya menjalankan PostgreSQL secara lokal. Apa yang harus saya instal untuk server web?
neuromancer
1
Node? Ini adalah server web yang cukup bagus, atau bisa jadi salah satunya, untuk menginstal secara lokal.
Timothy Meade

Jawaban:

872

Jadi apa yang "dibutuhkan?"

require()bukan bagian dari API JavaScript standar. Tetapi di Node.js, ini adalah fungsi bawaan dengan tujuan khusus: untuk memuat modul .

Modul adalah cara untuk membagi aplikasi menjadi file yang terpisah daripada memiliki semua aplikasi Anda dalam satu file. Konsep ini juga hadir dalam bahasa lain dengan sedikit perbedaan dalam sintaks dan perilaku, seperti C include, Python import, dan sebagainya.

Satu perbedaan besar antara modul Node.js dan JavaScript browser adalah bagaimana kode satu skrip diakses dari kode skrip lain.

  • Di JavaScript browser, skrip ditambahkan melalui <script>elemen. Ketika mereka mengeksekusi, mereka semua memiliki akses langsung ke ruang lingkup global, "ruang bersama" di antara semua skrip. Setiap skrip dapat dengan bebas menentukan / memodifikasi / menghapus / memanggil apa pun di lingkup global.

  • Di Node.js, setiap modul memiliki cakupannya sendiri. Modul tidak dapat secara langsung mengakses hal-hal yang didefinisikan dalam modul lain kecuali modul itu memilih untuk mengeksposnya. Untuk mengekspos sesuatu dari modul, mereka harus ditugaskan ke exportsatau module.exports. Agar modul dapat mengakses modul lain exportsatau module.exports, modul itu harus digunakanrequire() .

Dalam kode Anda, var pg = require('pg');muat pgmodul, klien PostgreSQL untuk Node.js. Ini memungkinkan kode Anda untuk mengakses fungsionalitas API klien PostgreSQL melalui pgvariabel.

Mengapa ia bekerja di simpul tetapi tidak di laman web?

require(), module.exportsdan exportsAPI dari sistem modul yang khusus untuk Node.js. Browser tidak menerapkan sistem modul ini.

Juga, sebelum saya bisa bekerja di node, saya harus melakukannya npm install pg. Tentang apa itu?

NPM adalah layanan repositori paket yang menampung modul JavaScript yang diterbitkan. npm installadalah perintah yang memungkinkan Anda mengunduh paket dari repositori mereka.

Di mana ia meletakkannya, dan bagaimana Javascript menemukannya?

Cli npm menempatkan semua modul yang diunduh dalam node_modulesdirektori tempat Anda berlari npm install. Node.js memiliki dokumentasi yang sangat terperinci tentang bagaimana modul menemukan modul lain yang mencakup menemukan node_modulesdirektori.

Yusuf
sumber
13
Saya pikir WebPack juga memiliki requiredukungannya sendiri ?
Benny Bottema
2
Mengapa Node.js membutuhkan fungsi ini?
Melab
24
@Elab Karena modularisasi diperlukan segera setelah kode membengkak menjadi sesuatu yang lebih besar daripada latihan pengkodean universitas dan mulai melibatkan lebih dari 1 orang. Itulah sebabnya kami telah menggunakannya sejak, seperti, selamanya .
David Tonhofer
3
Yang setara dalam PHP adalah include/require[_once]( tautan php.net ), bukan use, yang merupakan kata kunci aliasing .
nevvermind
107

Baiklah, jadi mari kita mulai dengan membuat perbedaan antara Javascript di browser web , dan Javascript di server (CommonJS dan Node).

Javascript adalah bahasa yang secara tradisional terbatas pada browser web dengan konteks global terbatas yang didefinisikan sebagian besar oleh apa yang kemudian dikenal sebagai Document Object Model (DOM) level 0 (Netscape Navigator Javascript API).

Javascript sisi-server menghilangkan batasan itu dan memungkinkan Javascript untuk memanggil berbagai bagian kode asli (seperti pustaka Postgres) dan membuka soket.

Sekarang require()adalah panggilan fungsi khusus yang didefinisikan sebagai bagian dari spesifikasi CommonJS. Dalam node, ia menyelesaikan perpustakaan dan modul di jalur pencarian Node, sekarang biasanya didefinisikan sebagai node_modulesdalam direktori yang sama (atau direktori file javascript yang dipanggil) atau jalur pencarian di seluruh sistem.

Untuk mencoba menjawab sisa pertanyaan Anda, kami perlu menggunakan proxy antara kode yang berjalan di browser dan server database.

Karena kami sedang mendiskusikan Node dan Anda sudah terbiasa dengan cara menjalankan kueri dari sana, masuk akal untuk menggunakan Node sebagai proxy itu.

Sebagai contoh sederhana, kita akan membuat URL yang mengembalikan beberapa fakta tentang Beatle, diberi nama, sebagai 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');
Timothy Meade
sumber
2
itu membingungkan ... metode createServerini membingungkan ... itu menunjukkan bahwa saya hanya bisa mau membuat server sepanjang waktu, kapan pun saya mau ... kontras dengan paradigma WAMP saya: sekitar 5 tahun yang lalu saya instal (mis. 'dibuat ') sebuah server di laptop windowsXP saya, dan saya tidak pernah' membuat 'server lain sejak ... sekarang tiba-tiba saya bisa mulai membuat server ... ini membingungkan ..
dsdsdsdsd
dan apa yang 'diungkapkan' ... ketika saya mencari C:\Program Files\nodejs\ file atau direktori bernama express, saya tidak mendapatkan kecocokan ... jadi dari mana asalnya ...
dsdsdsdsd
1
Express adalah kumpulan middleware dan kerangka kerja yang membuatnya lebih mudah untuk membuat server web di node.js, Anda harus menginstalnya bersama npm. Anda dapat menemukan informasi lebih lanjut di sini: expressjs.com
Timothy Meade
Itu penjelasan yang sangat bagus. Saya punya pertanyaan apakah memerlukan kerja dengan jalur dinamis di kedua lingkungan NodeJS & browser?
M.Abulsoud
29

Ini digunakan untuk memuat modul. Mari kita gunakan contoh sederhana.

Dalam file 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;
    }
}

Kita dapat menggunakan ini melalui require, seperti:

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

The require()metode yang digunakan untuk beban dan cache modul JavaScript. Jadi, jika Anda ingin memuat modul JavaScript relatif lokal ke aplikasi Node.js, Anda bisa menggunakan require()metode ini.

Contoh:

var yourModule = require( "your_module_name" ); //.js file extension is optional
Sudhir Bastakoti
sumber
9
Bagaimana jika Anda mencoba menggunakannya di halaman web?
neuromancer
1
Saya mencoba mendapatkan yang di atas untuk dimuat di halaman web!
ahli saraf
7
Apakah blok kode pertama seharusnya dalam file bernama circle_object.js?
user1416227
24

Saya perhatikan bahwa sementara jawaban lain menjelaskan apa yang diperlukan dan bahwa itu digunakan untuk memuat modul di Node, mereka tidak memberikan jawaban penuh tentang cara memuat modul simpul saat bekerja di Browser.

Ini cukup sederhana untuk dilakukan. Instal modul Anda menggunakan npm seperti yang Anda jelaskan, dan modul itu sendiri akan terletak di folder yang biasanya disebut node_modules.

Sekarang cara termudah untuk memuatnya ke dalam aplikasi Anda adalah dengan merujuknya dari html Anda dengan tag skrip yang menunjuk pada direktori ini. yaitu jika direktori node_modules Anda berada di root proyek pada tingkat yang sama dengan index.html Anda, Anda akan menulis ini di index.html Anda:

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

Seluruh skrip itu sekarang akan dimuat ke halaman - sehingga Anda dapat mengakses variabel dan metodenya secara langsung.

Ada pendekatan lain yang lebih banyak digunakan dalam proyek-proyek yang lebih besar, seperti loader modul seperti require.js . Dari keduanya, saya belum menggunakan Tuntut diri saya, tetapi saya pikir itu dianggap oleh banyak orang cara untuk pergi.

Sam Redway
sumber
Anda hanya perlu pergi ke root folder proyek Anda dan ketik npm install <name of module>. Sebagai contoh jika Anda mengetik npm install bootstrap, ia akan menginstal bootstrap ke direktori yang disebut node_modules / bootstrap. Dan sekarang Anda dapat memuat bootstrap ke aplikasi Anda seperti dijelaskan di atas. Anda harus menginstal node dan npm agar dapat menggunakannya dengan jelas. Jika Anda membutuhkan informasi lebih lanjut, silakan berikan kesalahan yang Anda dapatkan.
Sam Redway
<name of module>? Ini adalah struktur direktori saya. Folder root adalah xyz. xyz/index.htmlmenunjuk ke xyz/js/scripts.jsmenggunakanscript tag . xyz/js/scripts.jsmemiliki kode require('./module1.js');require('./module2.js');. module1.jsSaya module2.jsjuga di xyz/jsfolder. Sekarang, bagaimana cara saya membuat scripts.jstersedia untuk browser?
overexchange
16

Anda tahu bagaimana ketika Anda menjalankan JavaScript di browser, Anda memiliki akses ke variabel seperti "jendela" atau Matematika? Anda tidak harus mendeklarasikan variabel-variabel ini, variabel-variabel itu telah ditulis untuk Anda gunakan kapan pun Anda mau.

Nah, ketika Anda menjalankan file di lingkungan Node.js, ada variabel yang bisa Anda gunakan. Ini disebut "modul" Ini adalah objek. Ia memiliki properti yang disebut "ekspor." Dan kerjanya seperti ini:

Dalam file yang kami beri nama example.js, Anda menulis:

contoh.js

module.exports = "some code";

Sekarang, Anda ingin string ini "beberapa kode" di file lain.

Kami akan memberi nama file lain otherFile.js

Dalam file ini, Anda menulis:

otherFile.js

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

Pernyataan membutuhkan () masuk ke file yang Anda masukkan ke dalamnya, menemukan data apa pun yang disimpan di properti module.exports. Bagian let str = ... dari kode Anda berarti bahwa apa pun yang membutuhkan pengembalian pernyataan disimpan ke variabel str.

Jadi, dalam contoh ini, hasil akhirnya adalah di otherFile.js Anda sekarang memiliki ini:

biarkan string = "some code";

  • atau -

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

catatan:

nama file yang tertulis di dalam pernyataan membutuhkan: Jika itu adalah file lokal, itu harus path file ke example.js. Juga, ekstensi .js ditambahkan secara default, jadi saya tidak perlu menulisnya.

Anda melakukan sesuatu yang serupa ketika membutuhkan pustaka node.js, seperti Express. Dalam file express.js, ada objek bernama 'modul', dengan properti bernama 'ekspor'.

Jadi, sepertinya ada di sepanjang garis ini, di bawah tenda (saya agak pemula sehingga beberapa detail ini mungkin tidak tepat, tetapi untuk menunjukkan konsep:

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

Jika Anda memerlukan modul, tampilannya seperti ini: const moduleName = require ("module-name");

Jika Anda memerlukan file lokal, tampilannya seperti ini: const localFile = require ("./ path / to / local-file");

(perhatikan ./ di awal nama file)


Perhatikan juga bahwa secara default, ekspor adalah objek .. misalnya module.exports = {} Jadi, Anda dapat menulis module.exports.myfunction = () => {} sebelum memberikan nilai ke module.exports. Tetapi Anda juga dapat mengganti objek dengan menulis module.exports = "Saya bukan objek lagi."

Maiya
sumber
6

Dua rasa module.exports / membutuhkan:

(lihat disini )


File ekspor rasa 1 (misc.js):

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

file lain:

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


File ekspor rasa 2 (user.js):

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

file lain:

var user = require('./user');
var u = new user();
mike rodent
sumber