이 자바 스크립트는 무엇입니까?


505

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는 그것을 어떻게 찾습니까?


45
require는 javascript의 일부가 아니며 nodejs에서 사용되는 키워드입니다. nodejs는 클라이언트 측에서 사용하는 DOM이 아니므로 nodejs와 작동하는 스크립트가 브라우저에서 작동하지 않을 수 있습니다. nodejs에서 창이나 문서를 호출 할 수 있습니까? 브라우저에서 요구하는 것과 동일합니다.
mpm

8
브라우저에서 작동하도록 위의 코드를 어떻게 변경합니까?
neuromancer

8
웹 페이지에서 직접 Pg와 대화 할 수 없습니다. 바이너리 데이터를주고받을 수있는 일반 tcp / ip 소켓을 열 수 있어야합니다. 웹 브라우저에서는 그렇게 할 수 없습니다. 언급 한 라이브러리는 node.js의 확장이며 클라이언트 JavaScript에서는 작동하지 않습니다. 웹 서버와 JSON 요청 / 응답을 통해 클라이언트에서 PostgreSQL 서버와 대화하는 것이 좋습니다.
Craig Ringer

1
PostgreSQL을 로컬로 실행하고 있습니다. 웹 서버를 위해 무엇을 설치해야합니까?
neuromancer

1
마디? 로컬에 설치하기에는 꽤 좋은 웹 서버이거나 하나 일 수 있습니다.
Timothy Meade 2016 년

답변:


872

이것이 무엇입니까?

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.exportsexports특정이 Node.js.으로하는 모듈 시스템의 API가있다 브라우저는이 모듈 시스템을 구현하지 않습니다.

또한 노드에서 작동하기 전에해야했습니다 npm install pg. 그게 뭐야?

NPM 은 게시 된 JavaScript 모듈을 호스팅하는 패키지 리포지토리 서비스입니다. npm install저장소에서 패키지를 다운로드 할 수있는 명령입니다.

그것을 어디에 넣었고 Javascript는 그것을 어떻게 찾습니까?

npm cli는 다운로드 한 모든 모듈을 node_modules사용자가 실행 한 디렉토리에 저장합니다 npm install. Node.js는 모듈node_modules디렉토리 찾기를 포함한 다른 모듈 을 찾는 방법대한 매우 자세한 문서를 가지고 있습니다 .


13

2
Node.js에이 기능이 필요한 이유는 무엇입니까?
Melab

23
@Melab 코드가 대학 코딩 연습보다 더 큰 것으로 확장되고 한 사람 이상이 참여하기 시작하면 모듈화가 필요하기 때문입니다. 이는 우리가 영원히 같은, 이후를 사용하고 이유 .
David Tonhofer

3
PHP와 동등한 것은 include/require[_once]( php.net link ) use가 아닌 별칭 키워드입니다.
nevvermind

107

자, 먼저 웹 브라우저의 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');

2
혼란 스럽습니다 ... 방법 createServer이 혼란 스럽습니다 ... 원하는대로 언제든지 서버를 만들 수 있다고 제안합니다 ... WAMP 패러다임과 대조됩니다 : 약 5 년 전에 설치했습니다 (예 : 'created ') 내 지금 WindowsXP 노트북에 서버, 나는 결코'다른 지금은 모든 갑자기 난 그냥 서버를 만들기 시작 할 수 있기 때문에 ... ... 그것은 혼란의 서버 .. '만들어
dsdsdsdsd

그리고 'express'는 무엇입니까? C:\Program Files\nodejs\ 라는 파일 또는 디렉토리를 검색 할 때 express일치하는 항목이 없습니다 ... 그래서 어디에서
왔습니까

1
Express는 node.js에서 웹 서버를보다 쉽게 ​​만들 수있게 해주는 미들웨어 및 프레임 워크 모음입니다 npm. 여기에서 자세한 정보를 찾을 수 있습니다 : expressjs.com
디모데 미드

아주 좋은 설명입니다. NodeJS 및 브라우저 환경 모두에서 동적 경로로 작업해야한다는 질문이 있습니까?
M.Abulsoud

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 모듈을로드하고 캐시하는 데 사용됩니다. 따라서 로컬 상대 자바 스크립트 모듈을 Node.js 애플리케이션에로드하려는 경우 require()메소드 를 사용하면 됩니다.

예:

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

9
웹 페이지에서 사용하려고하면 어떻게합니까?
neuromancer

1
위의 내용을 웹 페이지에로드하려고합니다!
neuromancer

7
첫 번째 코드 블록은 circle_object.js라는 파일에 있어야합니까?
user1416227

24

다른 답변이 필요한 것이 무엇인지 설명하고 노드에서 모듈을로드하는 데 사용되는 것으로 브라우저에서 작업 할 때 노드 모듈을로드하는 방법에 대한 완전한 대답을하지 않았다는 것을 알았습니다.

하는 것은 매우 간단합니다. 설명하는대로 npm을 사용하여 모듈을 설치하면 모듈 자체는 일반적으로 node_modules라는 폴더에 있습니다.

이제 앱에 앱을로드하는 가장 간단한 방법은이 디렉토리를 가리키는 스크립트 태그를 사용하여 HTML에서 참조하는 것입니다. 즉, node_modules 디렉토리가 index.html과 동일한 레벨의 프로젝트 루트에있는 경우 index.html에 작성합니다.

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

해당 스크립트 전체가 페이지에로드되므로 변수 및 메소드에 직접 액세스 할 수 있습니다.

require.js 와 같은 모듈 로더와 같이 더 큰 프로젝트에서 더 널리 사용되는 다른 접근법이 있습니다 . 둘 중, 나는 나 자신 필요를 사용하지는 않았지만 많은 사람들이 그것을 갈 길이라고 생각합니다.


프로젝트 폴더의 루트로 이동하여 npm install <모듈 이름>을 입력하면됩니다. 예를 들어, npm install bootstrap을 입력하면 node_modules / bootstrap이라는 디렉토리에 부트 스트랩이 설치됩니다. 그리고 위에서 설명한대로 앱에 부트 스트랩을로드 할 수 있습니다. 분명히 사용하려면 node 및 npm이 설치되어 있어야합니다. 더 많은 정보가 필요하면 오류를 알려주십시오.
Sam Redway

<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.jsxyz/js폴더에 있습니다. 이제 scripts.js브라우저에서 어떻게 사용할 수 있습니까?
overexchange

16

브라우저에서 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 = "더 이상 객체가 아닙니다."를 작성하여 객체를 교체 할 수도 있습니다.


6

두 가지 맛의 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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.