PostgreSQL 데이터베이스에서 Javascript를 읽고 쓰려고합니다. 이 프로젝트 를 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는 그것을 어떻게 찾습니까?
답변
이것이 무엇입니까?
require()
표준 JavaScript API의 일부가 아닙니다. 그러나 Node.js에서는 모듈을로드 하는 특별한 목적을 가진 내장 함수입니다 .
모듈은 모든 응용 프로그램을 하나의 파일로 만드는 대신 응용 프로그램을 별도의 파일로 분할하는 방법입니다. 이 개념은 C include
, Python 등과 같이 구문과 동작에 약간의 차이가있는 다른 언어에도 존재 import
합니다.
Node.js 모듈과 브라우저 JavaScript의 큰 차이점 중 하나는 다른 스크립트 코드에서 하나의 스크립트 코드에 액세스하는 방법입니다.
-
브라우저 JavaScript에서 스크립트는
<script>
요소 를 통해 추가됩니다 . 이들이 실행될 때, 모든 스크립트에서 “공유 공간”인 전역 범위에 직접 액세스 할 수 있습니다. 모든 스크립트는 전역 범위의 모든 것을 자유롭게 정의 / 수정 / 제거 / 호출 할 수 있습니다. -
Node.js에서 각 모듈에는 고유 한 범위가 있습니다. 모듈은 다른 모듈에 정의 된 것을 노출시키지 않으면 직접 액세스 할 수 없습니다. 모듈에서 항목을 노출하려면
exports
또는에 할당해야합니다module.exports
. 모듈이 다른 모듈의 액세스하려면exports
또는module.exports
, 그것을 사용해야합니다require()
.
코드에서 Node.js 용 PostgreSQL 클라이언트 인 모듈을 var pg = require('pg');
로드합니다 pg
. 이를 통해 코드에서 pg
변수 를 통해 PostgreSQL 클라이언트 API의 기능에 액세스 할 수 있습니다 .
왜 노드에서 작동하지만 웹 페이지에서는 작동하지 않습니까?
require()
, module.exports
및 exports
특정이 Node.js.으로하는 모듈 시스템의 API가있다 브라우저는이 모듈 시스템을 구현하지 않습니다.
또한 노드에서 작동하기 전에해야했습니다
npm install pg
. 그게 뭐야?
NPM 은 게시 된 JavaScript 모듈을 호스팅하는 패키지 리포지토리 서비스입니다. npm install
저장소에서 패키지를 다운로드 할 수있는 명령입니다.
그것을 어디에 넣었고 Javascript는 그것을 어떻게 찾습니까?
npm cli는 다운로드 한 모든 모듈을 node_modules
사용자가 실행 한 디렉토리에 저장합니다 npm install
. Node.js는 모듈 이 node_modules
디렉토리 찾기를 포함한 다른 모듈 을 찾는 방법 에 대한 매우 자세한 문서를 가지고 있습니다 .
답변
자, 먼저 웹 브라우저의 Javascript 와 서버의 Javascript (CommonJS 및 Node)를 구별 해 봅시다 .
Javascript는 전통적으로 DOM (Document Object Model) 레벨 0 (Netscape Navigator Javascript API)으로 알려진 것에 의해 정의 된 제한된 글로벌 컨텍스트를 갖는 웹 브라우저에 국한된 언어입니다.
서버 측 Javascript는 이러한 제한을 없애고 Javascript가 Postgres 라이브러리와 같은 다양한 원시 코드를 호출하고 소켓을 열 수 있도록합니다.
이제 require()
CommonJS 스펙의 일부로 정의 된 특수 함수 호출입니다. 노드에서 노드 검색 경로의 라이브러리 및 모듈을 분석합니다. 이제는 일반적으로 node_modules
동일한 디렉토리 (또는 호출 된 JavaScript 파일의 디렉토리) 또는 시스템 전체 검색 경로에서 정의됩니다.
나머지 질문에 대답하려면 브라우저에서 실행되는 코드와 데이터베이스 서버 사이에 프록시를 사용해야합니다.
Node에 대해 논의하고 있고 거기에서 쿼리를 실행하는 방법에 대해 이미 알고 있으므로 Node를 해당 프록시로 사용하는 것이 좋습니다.
간단한 예로, 이름이 주어진 비틀에 대한 몇 가지 사실을 JSON으로 반환하는 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');
답변
모듈을로드하는 데 사용됩니다. 간단한 예를 보자.
파일에서 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 모듈을로드하고 캐시하는 데 사용됩니다. 따라서 로컬 상대 자바 스크립트 모듈을 Node.js 애플리케이션에로드하려는 경우 require()
메소드 를 사용하면 됩니다.
예:
var yourModule = require( "your_module_name" ); //.js file extension is optional
답변
다른 답변이 필요한 것이 무엇인지 설명하고 노드에서 모듈을로드하는 데 사용되는 것으로 브라우저에서 작업 할 때 노드 모듈을로드하는 방법에 대한 완전한 대답을하지 않았다는 것을 알았습니다.
하는 것은 매우 간단합니다. 설명하는대로 npm을 사용하여 모듈을 설치하면 모듈 자체는 일반적으로 node_modules라는 폴더에 있습니다.
이제 앱에 앱을로드하는 가장 간단한 방법은이 디렉토리를 가리키는 스크립트 태그를 사용하여 HTML에서 참조하는 것입니다. 즉, node_modules 디렉토리가 index.html과 동일한 레벨의 프로젝트 루트에있는 경우 index.html에 작성합니다.
<script src="node_modules/ng"></script>
해당 스크립트 전체가 페이지에로드되므로 변수 및 메소드에 직접 액세스 할 수 있습니다.
require.js 와 같은 모듈 로더와 같이 더 큰 프로젝트에서 더 널리 사용되는 다른 접근법이 있습니다 . 둘 중, 나는 나 자신 필요를 사용하지는 않았지만 많은 사람들이 그것을 갈 길이라고 생각합니다.
답변
브라우저에서 JavaScript를 실행할 때 “창”또는 수학과 같은 변수에 액세스하는 방법을 알고 있습니까? 이 변수를 선언 할 필요는 없으며 언제든지 변수를 사용할 수 있도록 작성되었습니다.
Node.js 환경에서 파일을 실행할 때 사용할 수있는 변수가 있습니다. 이것을 “모듈”이라고합니다. 개체입니다. “수출”이라는 속성이 있습니다. 그리고 그것은 다음과 같이 작동합니다 :
example.js라는 파일에 다음과 같이 작성합니다.
example.js
module.exports = "some code";
이제이 문자열을 다른 파일에 “일부 코드”로 사용하려고합니다.
다른 파일 이름을 otherFile.js로 지정합니다
이 파일에서 다음을 작성하십시오.
otherFile.js
let str = require('./example.js')
require () 문은 그 안에 넣은 파일로 이동하여 module.exports 속성에 저장된 모든 데이터를 찾습니다. 코드의 let str = … 부분은 명령문 리턴이 필요한 모든 것이 str 변수에 저장됨을 의미합니다.
따라서이 예제에서 end-result는 otherFile.js에서 다음과 같은 결과를 얻습니다.
문자열 = “일부 코드”;
- 또는-
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 ( “./ path / to / local-file”);
(파일 이름의 시작 부분에 ./가 있습니다.)
또한 기본적으로 내보내기는 객체입니다. 예 : module.exports = {} 따라서, module.exports에 값을 할당하기 전에 module.exports.myfunction = () => {}을 작성할 수 있습니다. 그러나 module.exports = “더 이상 객체가 아닙니다.”를 작성하여 객체를 교체 할 수도 있습니다.
답변
두 가지 맛의 module.exports / 필요 :
( 여기 참조 )
맛 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();