Javascript này yêu cầu gì?


506

Tôi đang cố gắng để Javascript đọc / ghi vào cơ sở dữ liệu PostgreSQL. Tôi tìm thấy dự án này trên github. Tôi đã có thể lấy mã mẫu sau để chạy trong nút.

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

Tiếp theo tôi đã cố gắng làm cho nó chạy trên một trang web, nhưng dường như không có gì xảy ra. Tôi đã kiểm tra trên bảng điều khiển Javascript và nó chỉ nói "không yêu cầu xác định."

Vậy "yêu cầu này là gì?" Tại sao nó hoạt động trong nút nhưng không phải trong một trang web?

Ngoài ra, trước khi tôi làm cho nó hoạt động trong nút, tôi phải làm npm install pg. Nó là về cái gì vậy? Tôi đã xem trong thư mục và không tìm thấy một tập tin pg. Nó đã đặt nó ở đâu và Javascript tìm thấy nó như thế nào?


46
Yêu cầu không phải là một phần của javascript, nó là một từ khóa được sử dụng trong nodejs. nodejs không phải là DOM bạn sử dụng phía máy khách. Vì vậy, một tập lệnh có thể hoạt động với nodejs có thể không hoạt động trong trình duyệt. Bạn có thể gọi cửa sổ hoặc tài liệu trong nodejs? không, cũng tương tự đối với yêu cầu với trình duyệt.
mpm 28/03 '

8
Làm cách nào để thay đổi mã ở trên để nó hoạt động trong trình duyệt?
thần kinh học

8
Bạn không thể nói chuyện trực tiếp với PG từ một trang web; bạn cần có khả năng mở ổ cắm tcp / ip đơn giản mà bạn có thể gửi và nhận dữ liệu nhị phân thông qua và không có trình duyệt web nào cho phép bạn làm điều đó. Thư viện mà bạn đang đề cập là một phần mở rộng cho node.js và sẽ không hoạt động trong JavaScript máy khách. Tôi thực sự khuyên bạn nên nói chuyện với máy chủ PostgreQuery của bạn từ máy khách thông qua máy chủ web và các yêu cầu / trả lời JSON của bạn.
Craig Ringer

1
Tôi đang chạy PostgreSQL cục bộ. Tôi cần gì để cài đặt cho một máy chủ web?
thần kinh học

1
Nút? Đó là một máy chủ web khá tốt, hoặc có thể là một, để cài đặt cục bộ.
Timothy Meade

Câu trả lời:


872

Vậy "yêu cầu này là gì?"

require()không phải là một phần của API JavaScript tiêu chuẩn. Nhưng trong Node.js, đó là một hàm tích hợp với mục đích đặc biệt: để tải các mô-đun .

Các mô-đun là một cách để chia một ứng dụng thành các tệp riêng biệt thay vì có tất cả ứng dụng của bạn trong một tệp. Khái niệm này cũng có mặt trong các ngôn ngữ khác với sự khác biệt nhỏ về cú pháp và hành vi, như C's include, Python import, v.v.

Một điểm khác biệt lớn giữa các mô-đun Node.js và JavaScript trình duyệt là cách mã của một tập lệnh được truy cập từ mã của tập lệnh khác.

  • Trong JavaScript trình duyệt, các tập lệnh được thêm vào thông qua <script>phần tử. Khi họ thực thi, tất cả họ đều có quyền truy cập trực tiếp vào phạm vi toàn cầu, một "không gian chung" trong số tất cả các tập lệnh. Bất kỳ tập lệnh nào cũng có thể tự do định nghĩa / sửa đổi / xóa / gọi bất cứ thứ gì trên phạm vi toàn cầu.

  • Trong Node.js, mỗi mô-đun có phạm vi riêng. Một mô-đun không thể truy cập trực tiếp vào những thứ được xác định trong một mô-đun khác trừ khi nó chọn phơi bày chúng. Để phơi bày mọi thứ từ một mô-đun, chúng phải được gán cho exportshoặc module.exports. Để một mô-đun truy cập mô-đun khác exportshoặc module.exports, nó phải sử dụngrequire() .

Trong mã của bạn, var pg = require('pg');tải pgmô-đun, ứng dụng khách PostgreSQL cho Node.js. Điều này cho phép mã của bạn truy cập chức năng của API của ứng dụng khách PostgreSQL thông qua pgbiến.

Tại sao nó hoạt động trong nút nhưng không phải trong một trang web?

require(), module.exportsexportsAPI của một hệ thống mô-đun đó là cụ thể cho Node.js. Trình duyệt không thực hiện hệ thống mô-đun này.

Ngoài ra, trước khi tôi làm cho nó hoạt động trong nút, tôi phải làm npm install pg. Nó là về cái gì vậy?

NPM là một dịch vụ kho lưu trữ gói lưu trữ các mô-đun JavaScript được xuất bản. npm installlà một lệnh cho phép bạn tải xuống các gói từ kho lưu trữ của họ.

Nó đã đặt nó ở đâu và Javascript tìm thấy nó như thế nào?

Npm cli đặt tất cả các mô-đun đã tải xuống trong một node_modulesthư mục nơi bạn chạy npm install. Node.js có tài liệu rất chi tiết về cách các mô-đun tìm các mô-đun khác bao gồm tìm node_modulesthư mục.



2
Tại sao Node.js cần chức năng này?
Melab

24
@Melab Bởi vì việc mô đun hóa là cần thiết ngay khi bóng bay mã đến một cái gì đó lớn hơn một bài tập mã hóa đại học và bắt đầu liên quan đến hơn 1 người. Đó là lý do tại sao chúng tôi đã sử dụng chúng từ, như, mãi mãi .
David Tonhofer

3
Tương đương trong PHP sẽ là include/require[_once]( liên kết php.net ), không phải uselà một từ khóa bí danh .
nevvermind

107

Được rồi, vì vậy trước tiên hãy bắt đầu bằng cách phân biệt giữa Javascript trong trình duyệt web và Javascript trên máy chủ (CommonJS và Node).

Javascript là ngôn ngữ thường được giới hạn trong trình duyệt web với bối cảnh toàn cầu giới hạn được xác định chủ yếu bởi mức độ được gọi là Mô hình đối tượng tài liệu (DOM) cấp 0 (API Javascript của Netscape Navigator).

Javascript phía máy chủ loại bỏ hạn chế đó và cho phép Javascript gọi vào nhiều đoạn mã gốc khác nhau (như thư viện Postgres) và các ổ cắm mở.

Bây giờ require()là một cuộc gọi chức năng đặc biệt được xác định là một phần của thông số CommonJS. Trong nút, nó giải quyết các thư viện và mô-đun trong đường dẫn tìm kiếm Nút, giờ đây thường được định nghĩa là node_modulestrong cùng một thư mục (hoặc thư mục của tệp javascript được gọi) hoặc đường dẫn tìm kiếm trên toàn hệ thống.

Để cố gắng trả lời phần còn lại của câu hỏi của bạn, chúng tôi cần sử dụng proxy giữa mã đang chạy trong trình duyệt và máy chủ cơ sở dữ liệu.

Vì chúng ta đang thảo luận về Node và bạn đã quen với cách chạy truy vấn từ đó, nên sử dụng Node làm proxy đó sẽ hợp lý hơn.

Một ví dụ đơn giản, chúng ta sẽ tạo một URL trả về một vài sự thật về Beatle, được đặt tên là 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
thật khó hiểu ... phương pháp createServernày rất khó hiểu ... nó gợi ý rằng tôi có thể luôn luôn tạo ra các máy chủ, bất cứ khi nào tôi muốn ... tương phản với mô hình WAMP của tôi: khoảng 5 năm trước tôi đã cài đặt (ví dụ: 'đã tạo ') một máy chủ trên máy tính xách tay windowsXP của tôi và tôi chưa bao giờ' tạo 'một máy chủ khác kể từ ... bây giờ tôi đột nhiên có thể bắt đầu tạo máy chủ ... thật khó hiểu ..
dsdsdsdsd

và 'express' là gì ... khi tôi tìm kiếm C:\Program Files\nodejs\ một tập tin hoặc thư mục được gọi express, tôi không nhận được kết quả phù hợp ... vậy nó đến từ đâu ...
dsdsdsdsd

1
Express là một tập hợp các phần mềm trung gian và khung làm cho việc tạo một máy chủ web trong tệp node.js dễ dàng hơn, bạn sẽ cần phải cài đặt nó với npm. Bạn có thể tìm thêm thông tin ở đây: expressjs.com
Timothy Meade

Đó là lời giải thích rất tốt. Tôi có một câu hỏi không yêu cầu làm việc với các đường dẫn động trên cả hai môi trường NodeJS & trình duyệt?
M.Abulsoud

29

Nó được sử dụng để tải các mô-đun. Hãy sử dụng một ví dụ đơn giản.

Trong tập tin 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;
    }
}

Chúng ta có thể sử dụng điều này thông qua require, như:

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

Các require()phương pháp được sử dụng để tải và bộ nhớ cache module JavaScript. Vì vậy, nếu bạn muốn tải một mô-đun JavaScript tương đối cục bộ vào ứng dụng Node.js, bạn chỉ cần sử dụng require()phương thức này.

Thí dụ:

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

9
Điều gì nếu bạn đang cố gắng sử dụng nó trong một trang web?
thần kinh học

1
Tôi đang cố gắng tải phần trên để tải trang web!
thần kinh học

7
Là khối mã đầu tiên được cho là nằm trong một tệp có tên circle_object.js?
dùng1416227

24

Tôi nhận thấy rằng trong khi các câu trả lời khác giải thích yêu cầu là gì và nó được sử dụng để tải các mô-đun trong Nút, họ không trả lời đầy đủ về cách tải các mô-đun nút khi làm việc trong Trình duyệt.

Nó khá đơn giản để làm. Cài đặt mô-đun của bạn bằng cách sử dụng npm như bạn mô tả và chính mô-đun sẽ được đặt trong một thư mục thường được gọi là node_modules.

Bây giờ cách đơn giản nhất để tải nó vào ứng dụng của bạn là tham chiếu nó từ html của bạn với thẻ script chỉ vào thư mục này. tức là nếu thư mục node_modules của bạn nằm trong thư mục gốc của dự án ở cùng cấp với index.html, bạn sẽ viết cái này trong index.html:

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

Toàn bộ tập lệnh đó bây giờ sẽ được tải vào trang - vì vậy bạn có thể truy cập trực tiếp vào các biến và phương thức của nó.

Có những cách tiếp cận khác được sử dụng rộng rãi hơn trong các dự án lớn hơn, chẳng hạn như trình tải mô-đun như allow.js . Trong hai, tôi đã không sử dụng Yêu cầu bản thân, nhưng tôi nghĩ rằng nó được nhiều người xem xét để đi.


Bạn chỉ cần vào thư mục gốc của dự án và nhập npm install <name of module>. Ví dụ: nếu bạn gõ npm install bootstrap, nó sẽ cài đặt bootstrap vào một thư mục có tên là node_modules / bootstrap. Và bây giờ bạn có thể tải bootstrap vào ứng dụng của mình như được mô tả ở trên. Bạn sẽ cần phải cài đặt nút và npm để có thể sử dụng nó rõ ràng. Nếu bạn cần thêm thông tin xin vui lòng cung cấp cho các lỗi mà bạn đang nhận được.
Sam Redway

<name of module>? Đây là cấu trúc thư mục của tôi. Thư mục gốc là xyz. xyz/index.htmlđiểm để xyz/js/scripts.jssử dụng script tag. xyz/js/scripts.jscó mã require('./module1.js');require('./module2.js');. module1.js/ module2.jscũng nằm trong xyz/jsthư mục. Bây giờ, làm thế nào để tôi scripts.jscó sẵn cho trình duyệt?
trao đổi quá mức vào

16

Bạn biết làm thế nào khi bạn đang chạy JavaScript trong trình duyệt, bạn có quyền truy cập vào các biến như "window" hoặc Math? Bạn không phải khai báo các biến này, chúng đã được viết để bạn sử dụng bất cứ khi nào bạn muốn.

Chà, khi bạn đang chạy một tệp trong môi trường Node.js, có một biến mà bạn có thể sử dụng. Nó được gọi là "mô-đun" Nó là một đối tượng. Nó có một tài sản gọi là "xuất khẩu." Và nó hoạt động như thế này:

Trong một tệp mà chúng tôi sẽ đặt tên example.js, bạn viết:

example.js

module.exports = "some code";

Bây giờ, bạn muốn chuỗi này "một số mã" trong một tệp khác.

Chúng tôi sẽ đặt tên cho tệp khác otherFile.js

Trong tập tin này, bạn viết:

otherFile.js

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

Câu lệnh yêu cầu () đi đến tệp mà bạn đặt bên trong nó, tìm thấy bất kỳ dữ liệu nào được lưu trữ trên thuộc tính module.exports. Phần let = = ... trong mã của bạn có nghĩa là bất cứ điều gì yêu cầu trả về câu lệnh đều được lưu trữ vào biến str.

Vì vậy, trong ví dụ này, kết quả cuối cùng là trong otherFile.js bây giờ bạn có điều này:

let string = "một số mã";

  • hoặc là -

hãy để str = ('./example.js').module.exports

Ghi chú:

tên tệp được viết bên trong câu lệnh yêu cầu: Nếu đó là tệp cục bộ, thì đó phải là đường dẫn tệp đến example.js. Ngoài ra, phần mở rộng .js được thêm theo mặc định, vì vậy tôi không phải viết nó.

Bạn làm điều gì đó tương tự khi yêu cầu các thư viện node.js, chẳng hạn như Express. Trong tệp express.js, có một đối tượng có tên là 'mô-đun', với một thuộc tính có tên là 'export'.

Vì vậy, nó trông giống như dọc theo các dòng này, dưới mui xe (Tôi là người mới bắt đầu nên một số chi tiết có thể không chính xác, nhưng nó cho thấy khái niệm:

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

Nếu bạn đang yêu cầu một mô-đun, nó sẽ trông như thế này: const moduleName = quiries ("tên mô-đun");

Nếu bạn đang yêu cầu một tệp cục bộ, nó sẽ trông như thế này: const localFile = quiries ("./ path / to / local-file");

(chú ý ./ ở đầu tên tệp)


Cũng lưu ý rằng theo mặc định, xuất là một đối tượng .. ví dụ: module.exports = {} Vì vậy, bạn có thể viết module.exports.myfunction = () => {} trước khi gán giá trị cho module.exports. Nhưng bạn cũng có thể thay thế đối tượng bằng cách viết module.exports = "Tôi không còn là đối tượng nữa".


6

Hai hương vị của module.exports / yêu cầu:

(xem tại đây )


Tệp xuất hương vị 1 (misc.js):

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

tập tin khác:

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


Tệp xuất hương vị 2 (user.js):

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

tập tin khác:

var user = require('./user');
var u = new user();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.