Що для цього потрібно "Javascript"?


505

Я намагаюся змусити 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
вимагає не є частиною javascript, це ключове слово, яке використовується в nodejs. nodejs isnt DOM ви використовуєте клієнт side.so сценарій, який може працювати з nodejs, може не працювати в браузері. Чи можете ви зателефонувати у вікно чи документ у nodejs? ні, ну те ж, що потрібно для браузера.
mpm

8
Як змінити код вище, щоб він працював у браузері?
невромант

8
Ви не можете спілкуватися з Pg безпосередньо з веб-сторінки; вам потрібно буде мати можливість відкрити звичайний сокет tcp / ip, через який ви могли б надсилати та отримувати бінарні дані, і жоден веб-браузер не дозволить вам це зробити. Бібліотека, на яку ви посилаєтесь, є розширенням для node.js і не працюватиме в клієнтському JavaScript. Настійно рекомендую поговорити зі своїм сервером PostgreSQL від клієнта через веб-сервер та запити / відповіді JSON.
Крейг Рінгер

1
Я запускаю PostgreSQL локально. Що потрібно встановити для веб-сервера?
невромант

1
Вузол? Це досить хороший веб-сервер, або може бути один, щоб встановити локально.
Тимофі Мід

Відповіді:


872

Отже, що це "вимагає?"

require()не входить до стандартного API JavaScript. Але в Node.js це вбудована функція з особливим призначенням: завантажувати модулі .

Модулі - це спосіб розділити додаток на окремі файли, а не всю вашу програму в одному файлі. Ця концепція присутня і в інших мовах з незначними відмінностями в синтаксисі та поведінці, як, наприклад, C's include, Python's importтощо.

Велика різниця між модулями Node.js та JavaScript браузера - це доступ до коду одного сценарію з коду іншого сценарію.

  • У браузері JavaScript сценарії додаються через <script>елемент. Коли вони виконують, всі вони мають прямий доступ до глобальної сфери, "спільного простору" серед усіх сценаріїв. Будь-який сценарій може вільно визначати / змінювати / видаляти / викликати що-небудь у глобальному масштабі.

  • У Node.js кожен модуль має власну сферу застосування. Модуль не може безпосередньо отримати доступ до речей, визначених в іншому модулі, якщо він не вирішить їх викрити. Для викриття речей з модуля вони повинні бути призначені до exportsабо module.exports. Щоб модуль отримав доступ до іншого модуля exportsабо module.exports, він повинен використовуватиrequire() .

У ваш код var pg = require('pg');завантажується pgмодуль, клієнт PostgreSQL для Node.js. Це дозволяє вашому коду отримати доступ до функціональних можливостей API клієнтів PostgreSQL через pgзмінну.

Чому він працює у вузлі, але не на веб-сторінці?

require(), module.exportsі exportsє API модульної системи, характерної для Node.js. Браузери не реалізують цю модульну систему.

Крім того, перш ніж я змусив його працювати у вузлі, мені довелося це зробити npm install pg. Про що це?

NPM - служба сховища пакетів, яка розміщує опубліковані модулі JavaScript. npm installце команда, яка дозволяє завантажувати пакети з їх сховища.

Де він її розмістив і як Javascript його знайшов?

Npm cli поміщає всі завантажені модулі в node_modulesкаталог, де ви працювали npm install. Node.js має дуже детальну документацію про те, як модулі знаходять інші модулі, що включає пошук node_modulesкаталогу.



2
Чому Node.js потрібна ця функціональність?
Мелаб

23
@Melab Тому що модуляризація потрібна, як тільки код переходить на щось більше, ніж університетське кодування, і починає брати участь більше 1 людини. Саме тому ми використовували їх з тих пір, як, назавжди .
Девід Тонхофер

3
Еквівалент в PHP буде include/require[_once]( php.net посилання ), а НЕ use, що є згладжування ключових слів.
nevvermind

107

Гаразд, давайте спочатку почнемо з розмежування Javascript у веб-браузері та Javascript на сервері (CommonJS та Node).

Javascript - це мова, яка традиційно обмежується веб-браузером з обмеженим глобальним контекстом, який визначається, головним чином, тим, що стало відомим як Модель об'єкта документа (DOM) рівня 0 (API Javascript Netcape Navigator).

На сервері Javascript усуває це обмеження і дозволяє Javascript вводити різні фрагменти нативного коду (наприклад, бібліотека Postgres) та відкривати сокети.

Тепер require()це спеціальний виклик функції, визначений як частина специфікації CommonJS. У вузлі він вирішує бібліотеки та модулі в шляху пошуку вузла, тепер зазвичай визначається як node_modulesу тому самому каталозі (або в каталозі викликаного файлу javascript) або в загальносистемному шляху пошуку.

Щоб спробувати відповісти на решту вашого запитання, нам потрібно використовувати проксі-сервер між кодом, що працює в браузері, і сервером бази даних.

Оскільки ми обговорюємо Node, і ви вже знайомі з тим, як запустити запит звідти, було б доцільно використовувати Node як проксі.

Як простий приклад, ми збираємось створити URL-адресу, яка повертає кілька фактів про Beatle з назвою 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

і що таке "express" ... коли я шукаю C:\Program Files\nodejs\ файл чи каталог, який називається express, я не отримую відповідності ... тож звідки воно береться ...
dsdsdsdsd

1
Express - це набір проміжних програм та фреймворків, що спрощує створення веб-сервера в node.js, вам потрібно буде встановити його npm. Додаткову інформацію можна знайти тут: expressjs.com
Тімоті Мід

Це дуже хороше пояснення. У мене виникає питання, чи потрібна робота з динамічними контурами для обох середовищ NodeJS та браузера?
М.Абулсуд

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
Що робити, якщо ви намагаєтесь використовувати його на веб-сторінці?
невромант

1
Я намагаюся змусити вищезазначене завантажити веб-сторінку!
невромант

7
Чи повинен бути перший блок коду у файлі з іменем circle_object.js?
користувач1416227

24

Я помітив, що в інших відповідях пояснюється, що потрібно, і що він використовується для завантаження модулів у Node, вони не давали повної відповіді про те, як завантажувати модулі вузлів під час роботи в браузері.

Це зробити досить просто. Встановіть модуль, використовуючи npm, як ви описуєте, а сам модуль буде розташований у папці, яка зазвичай називається node_modules.

Тепер найпростіший спосіб завантажити його у свою програму - це посилання на нього з вашого HTML із тегом скрипту, який вказує на цей каталог. тобто, якщо ваш каталог node_modules знаходиться в корені проекту на тому ж рівні, що і ваш index.html, ви б написали це у своєму index.html:

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

Весь цей сценарій тепер буде завантажений на сторінку, тому ви зможете отримати доступ до його змінних та методів безпосередньо.

Існують і інші підходи , які більш широко використовуються в великих проектах, таких як модуль завантажувача , як require.js . З двох я не використовував себе Require, але думаю, що багато людей вважають його шляхом.


Вам просто потрібно перейти до кореня папки проекту та ввести npm install <назва модуля>. Наприклад, якщо ви введете npm install bootstrap, він встановить bootstrap в каталог під назвою node_modules / bootstrap. Тепер ви можете завантажити завантажувальну програму у свій додаток, як описано вище. Вам потрібно буде встановити вузол і npm, щоб мати можливість очевидно використовувати його. Якщо вам потрібна додаткова інформація, будь ласка, вкажіть помилку, яку ви отримуєте.
Сем Редвей

<name of module>? Ось моя структура каталогів. Коренева папка є xyz. xyz/index.htmlвказує на xyz/js/scripts.jsвикористання script tag. xyz/js/scripts.jsмає код require('./module1.js');require('./module2.js');. module1.js/ module2.jsтакож знаходяться в xyz/jsпапці. Тепер, як зробити scripts.jsдоступним для браузера?
переобмін

16

Ви знаєте, як при запуску JavaScript у браузері ви маєте доступ до змінних, таких як "window" або Math? Вам не потрібно оголошувати ці змінні, вони були написані для вас, коли ви хочете.

Добре, коли ви запускаєте файл у середовищі Node.js, ви можете використовувати змінну. Це називається "модуль" Це об'єкт. Він має властивість під назвою "експорт". І це працює так:

У файлі, який ми будемо називати example.js, ви пишете:

example.js

module.exports = "some code";

Тепер ви хочете, щоб цей рядок "якийсь код" в іншому файлі.

Ми назвемо інший файл otherFile.js

У цей файл ви пишете:

otherFile.js

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

Це вимагає () оператора переходить у файл, який ви помістили всередину нього, і виявить, що дані зберігаються у властивості module.exports. Нехай str = ... частина вашого коду означає, що все, що вимагає оператора, повертається, зберігається у змінній str.

Отже, у цьому прикладі кінцевим результатом є те, що в otherFile.js у вас зараз таке:

let string = "деякий код";

  • або -

нехай str = ('./example.js').module.exports

Примітка:

ім'я файлу, яке записується всередині оператора вимагає: Якщо це локальний файл, він повинен бути шлях до файлу example.js. Також розширення .js додається за замовчуванням, тому мені не довелося його писати.

Ви робите щось подібне, вимагаючи бібліотеки node.js, наприклад Express. У файлі express.js є об'єкт з назвою 'module', властивість якого називається 'export'.

Отже, це виглядає приблизно так, як під цими лініями, під капотом (я дещо початківець, тому деякі з цих деталей можуть бути не точними, але це показати концепцію:

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 = need ("ім'я модуля");

Якщо вам потрібен локальний файл, він виглядає приблизно так: const localFile = requ ("./ path / to / local-file");

(зверніть увагу на ./ на початку імені файлу)


Також зауважте, що за замовчуванням експорт - це об'єкт .. наприклад module.exports = {} Отже, ви можете написати module.exports.myfunction = () => {} перед тим, як призначити значення module.exports. Але ви також можете замінити об'єкт, написавши module.exports = "Я вже не об'єкт."


6

Два смаки модуля. Експортує / вимагає:

(див. тут )


Експортний файл аромату 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.