wake-up-neo.com

이 Javascript는 무엇입니까?

Javascript가 PostgreSQL 데이터베이스를 읽고 쓸 수있게하려고합니다. 나는이 project github에서 발견했습니다. 노드에서 실행할 다음 샘플 코드를 가져올 수있었습니다.

var pg = require('pg'); //native libpq bindings = `var pg = require('pg').native`
var conString = "tcp://postgres:[email protected]/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를 수행해야했습니다. 그것에 대해 무엇입니까? 디렉토리에서 파일을 찾지 못했습니다. 어디에 넣었고, 자바 스크립트는 어떻게 찾았습니까?

400
neuromancer

그럼이게 뭐야? "요구?"

require() 는 표준 JavaScript API의 일부가 아닙니다. 하지만 Node.js에서는 특별한 목적을 가진 내장 함수입니다 : 모듈을로드하려면 .

모듈은 하나의 파일에 모든 응용 프로그램이있는 대신 응용 프로그램을 별도의 파일로 분할하는 방법입니다. 이 개념은 C의 include, PHP의 use, Python의 import 등과 같은 구문 및 동작에 약간의 차이가있는 다른 언어에서도 제공됩니다.

Node.js 모듈과 브라우저 JavaScript 사이의 큰 차이점 중 하나는 스크립트의 코드가 다른 스크립트의 코드에서 어떻게 액세스되는지입니다.

  • 브라우저 JavaScript에서는 스크립트가 <script> 요소를 통해 추가됩니다. 실행시 전역 범위에 직접 액세스 할 수 있으며 모든 스크립트 중에서 "공유 공간"을 갖습니다. 모든 스크립트는 전역 범위에서 자유롭게 정의/수정/제거/호출 할 수 있습니다.

  • Node.js에는 각 모듈마다 자체 범위가 있습니다. 모듈은 모듈을 노출하기로 선택하지 않으면 다른 모듈에 정의 된 항목에 직접 액세스 할 수 없습니다. 모듈에서 정보를 노출하려면 exports 또는 module.exports에 할당되어야합니다. 모듈이 다른 모듈의 exports 또는 module.exports에 액세스하려면 require()을 사용해야합니다.

코드에서 var pg = require('pg');은 Node.js 용 PostgreSQL 클라이언트 인 pg 모듈을로드합니다. 이렇게하면 코드가 pg 변수를 통해 PostgreSQL 클라이언트의 API 기능에 액세스 할 수 있습니다.

노드에서 작동하지만 웹 페이지에서 작동하지 않는 이유는 무엇입니까?

require(), module.exportsexports은 Node.js에만 해당하는 모듈 시스템의 API입니다. 브라우저는이 모듈 시스템을 구현하지 않습니다.

또한 노드에서 작동하기 전에 npm install pg를 수행해야했습니다. 그것에 대해 무엇입니까?

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

어디에 넣었고, 자바 스크립트는 어떻게 찾았습니까?

Node.js는 모듈이 다른 모듈을 찾는 방법 에 대한 매우 상세한 문서를 가지고 있습니다. 그러나 Gist에서는 다운로드 한 모든 모듈을 node_modules를 실행 한 디렉토리에 npm install에 저장합니다.

685
Joseph

자, 우선 자바 스크립트 웹 브라우저에서와 자바 스크립트 서버에서 (CommonJS 및 Node)를 구별 해 봅시다.

Javascript는 전통적으로 DOM (Document Object Model) 레벨 0 (Netscape Navigator Javascript API)으로 알려진 것에 의해 정의 된 제한된 글로벌 컨텍스트를 갖는 웹 브라우저에 국한된 언어입니다.

서버 측 Javascript는 이러한 제한을 없애고 Javascript가 Postgres 라이브러리와 같은 다양한 원시 코드를 호출하고 소켓을 열 수 있도록합니다.

이제 require()은 CommonJS 스펙의 일부로 정의 된 특수 함수 호출입니다. 노드에서 Node 검색 경로에서 라이브러리 및 모듈을 분석합니다. 이제는 일반적으로 동일한 디렉토리 (또는 호출 된 JavaScript 파일의 디렉토리) 또는 시스템 전체 검색 경로에서 node_modules로 정의됩니다. .

나머지 질문에 대답하려면 브라우저에서 실행되는 코드와 데이터베이스 서버 사이에 프록시를 사용해야합니다.

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');
99
Timothy Meade

모듈을로드하는 데 사용됩니다. 간단한 예제를 사용합시다.

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
27
Sudhir Bastakoti

다른 답변이 무엇을 요구하는지 설명하고 노드에서 모듈을로드하는 데 사용된다는 사실을 알았지 만 브라우저에서 작업 할 때 노드 모듈을로드하는 방법에 대한 전체 답장을 제공하지 않았습니다.

그것은 매우 간단합니다. 설명대로 npm을 사용하여 모듈을 설치하면 모듈 자체가 보통 node_modules라고하는 폴더에 위치합니다.

이제 앱에로드하는 가장 간단한 방법은이 디렉토리를 가리키는 스크립트 태그로 html에서 참조하는 것입니다. 즉 node_modules 디렉토리가 index.html과 같은 레벨의 프로젝트 루트에 있다면 index.html에 다음과 같이 작성합니다.

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

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

require.js 와 같은 모듈 로더와 같이 더 큰 프로젝트에서 더 널리 사용되는 다른 접근 방식이 있습니다. 이 두 가지 중에서, 나는 Require Require를 사용하지 않았지만 많은 사람들이 그것을 고려하고 있다고 생각합니다.

18
Sam Redway

브라우저에서 JavaScript를 실행하면 "창"이나 수학과 같은 변수에 액세스 할 수 있습니다. 이 변수들을 선언 할 필요는 없으며, 필요할 때마다 사용할 수 있도록 작성되었습니다.

Node.js 환경에서 파일을 실행할 때 사용할 수있는 변수가 있습니다. 그것은 "모듈"이라고 불린다. 그것은 하나의 객체이다. 그것은 "수출"이라는 속성을 가지고 있습니다. 그리고 다음과 같이 작동합니다.

Example.js 파일의 이름은 다음과 같습니다.

example.js

module.exports = "some code";

이제이 문자열을 다른 파일에 "some code"라고합니다.

다른 파일의 이름은 otherFile.js입니다.

이 파일에서 다음과 같이 작성합니다.

otherFile.js

let str = require('example.js')

Require () 문은 내부에 넣은 파일로 이동하여 module.exports 속성에 저장된 모든 데이터를 찾습니다. let str = ... 코드 부분은 명령문이 리턴해야하는 것이 str 변수에 저장된다는 것을 의미합니다.

따라서이 예제에서 최종 결과는 otherFile.js에 다음과 같이 표시됩니다.

let string = "some code";

  • 또는 -

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

노트 :

require 문 내부에 작성된 파일 이름 : 로컬 파일 인 경우 example.js의 파일 경로 여야합니다. 또한 .js 확장자가 기본적으로 추가되므로 필기 할 필요가 없습니다.

Express와 같은 node.js 라이브러리가 필요할 때 비슷한 작업을 수행합니다. express.js 파일에는 'module'이라는 객체가 있으며 'exports'라는 속성이 있습니다.

그래서, 그것은 두려운 부분 아래에있는 이런 라인들을 닮았습니다. (저는 약간 초보자입니다. 그래서 이러한 세부 사항 중 일부는 정확하지 않을 수도 있지만 개념을 보여줄 것입니다 :

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 ( "./ local-file");

(./ 파일 이름의 시작 부분에주의하십시오)

4
Maiya