2014-06-15 3 views
0

서버 (node.js)에 객체 whith 메소드 (함수)가 있습니다. 브라우저에서 메서드를 사용하여이 객체를 가져오고 싶습니다.메서드 (함수)를 사용하여 객체를 서버에서 클라이언트로 보낼 수 있습니까?

가능합니까?

I made simple example on GitHub

는 server.js과 index.html을 파일이 있습니다. 실행 -> 노드 서버. (주석 후)

++++++++ UPD 서버

내 객체 :

function ClassOrder(name, cost) { 
    this.name = name; 
    this.cost = cost; 
    this.parts = []; 
    this.summ = function() { 
    var summ = 0; 
    this.parts.forEach(function(part) { 
     summ += part.summ(); 
    }); 
    return summ + this.cost; 
    }; 
} 

var myobject = new ClassOrder('my object', 10); 
myobject.parts[0] = new ClassOrder('my first part', 20); 
myobject.parts[1] = new ClassOrder('my second part', 30); 
myobject.parts[1].parts[0] = new ClassOrder('my first in second part', 40); 

console.log(myobject); // view myobject in console 
console.log(myobject.summ()); // return 100 (10+20+30+40) 

이 (요청시) 클라이언트로 보내

res.end(JSON.stringify(myobject)); 

및 클라이언트의 자바 스크립트 코드 (브라우저)에서 가져 오기

function getobject() { 

    var xhr = new XMLHttpRequest(); 
    xhr.open('get', '/getobject', true); 

    xhr.onreadystatechange = function() { 
    if (xhr.readyState != 4) return; 

    var myobject = JSON.parse(this.responseText); 

    console.log(myobject); // all data ok 
    console.log(myobject.summ()); // no methods!! 

    }; 
    xhr.send(null); 
} 

간단한 예제이며 실제로는 prototype을 사용합니다 (또는 util (node.js)에서 상속). 서버에서이 메서드를 사용하고 DB에 저장합니다. 모든 일은 괜찮습니다. 하지만 클라이언트에서 사용하지 않을 경우 모든 방법을 복사하여 붙여 넣기해야합니다. 이유는 무엇입니까?

또한 클라이언트의 내 개체에 내 예제 메서드를 추가하는 방법을 잘 모릅니다.

+0

기술적으로 함수 코드를 직렬화하여 클라이언트 측에서 평가할 수 있지만 그 이유는 무엇입니까? 나는 코드를 유지하고 따르기가 더 어렵다고 주장 할 것이다. –

+0

해당 코드를 추출하여 질문에 넣으십시오. 여기에는 두 가지 이유가 있습니다. 1) 더 많은 사람들이 귀하의 질문을 이해하고 응답 할 의사가 있다는 것을 알게 될 것입니다. 코드는 관련 코드로 분류되어 귀하의 질문에 배치되고 2) StackOverflow의 유용성 부분은 다음과 같습니다. Q & A에 대한 더 오래 지속되는 리소스이자 질문에 대한 외부 참조는 시간이 지남에 따라 사라지거나 변경되어 질문 및 코드 링크의 유용성을 망치는 경향이 있습니다. – jfriend00

+0

@Felix Kling 내가 더블 코드를 갖고 싶지 않아. – pofigizm

답변

-1

내가 대답은 바로 거기라고 생각합니다 : Calling a JavaScript function returned from an Ajax response

그러나 그 스크립트 태그에 대한 답변을 넣을 필요가 없습니다 것,이 시도 :

eval(this.responseText) 
+0

이것은 엄청나게 큰 보안 위험입니다. 책임감있는'eval'! – Qix

+0

eval (this.responseText) before 나는 내 메소드를 서버 측 텍스트로 변환해야한다. 하나의 변형이지만 보안 위험이 있으며 많은 코드를 필요로합니다. – pofigizm

0

질문했다 : 어떻게 나는 더블 코딩을하지 않고 메소드를 사용하여 서버와 클라이언트가 동일한 객체를 얻는다.

두 가지 방법이 있습니다.

첫 번째 방법은 내 메서드 (함수)를 텍스트로 변환하고 개체와 함께 저장합니다. 그런 다음 Function 생성자를 사용하여 실행할 수 있습니다.

function ClassOrder(name, cost) { 
    this.name = name; 
    this.cost = cost; 
    this.parts = []; 

    this.summfunc = '\ 
    var summ=0; \ 
    obj.parts.forEach(function(part) { \ 
     summ += part.summ(); \ 
    }); \ 
    return summ + obj.cost;'; 
} 

ClassOrder.prototype.summ = function() { 
    return (new Function('obj', this.summfunc))(this); 
}; 

var myobject = JSON.parse(this.responseText); 

myobject.constructor.prototype.summ = function() { 
    return (new Function('obj', this.summfunc))(this); 
}; 

Link to commit on new branch on GItHub

내 모든 방법을 텍스트로 변환해야하기 때문에이 방법은 나쁜 브라우저

에서 사용할 수 있습니다. @Felix Kling이 어떻게 코드를 유지하고 따르기가 더 어려워 지는지 말합니다.

두 번째 방법 인은 서버와 클라이언트에서 클래스와 메서드가있는 파일 하나를 사용합니다. 그리고 ufter 데이터를 받아 내 수업에 "변환". 파일 order.js에서

내 클래스 (파일의 일부) :

function Order(object) { 
    object.parts = object.parts || []; 
    var partsArr = []; 
    object.parts.forEach(function (value, key) { 
    partsArr[key] = new Order(value); 
    }); 

    this.name = object.name || 'Default'; 
    this.cost = object.cost || 0; 
    this.parts = partsArr; 
} 

Order.prototype.summ = function() { 
    var summ = 0; 
    this.parts.forEach(function(part) { 
    summ += part.summ(); 
    }); 
    return summ + this.cost; 
}; 

순서를 필요로한다.JS와 전화 새로운 객체의 변경 인수 :

var Order = require('./order') 

var myobject = new Order({name:'my object', cost: 10}); 
myobject.parts[0] = new Order({name:'my first part', cost: 20}); 
myobject.parts[1] = new Order({name:'my second part', cost: 30}); 
myobject.parts[1].parts[0] = new Order({name:'my first in second part', cost: 40}); 

하고 마침내는 클라이언트에서이 파일을 사용하고 있습니다 :

<script src='order.js'></script> 
... 
var xhrobj = JSON.parse(this.responseText); 
var myobject = new Order(xhrobj); 

Link to commit on other branch on GItHub

나는이 방법은 먼저 더 나은 생각합니다.

+0

두 번째 방법은'order.js '에서 아무 것도 내보내 지 않기 때문에 작동하지 않습니다. 당신은'if (module && module.exports) {module.exports = Order; }'. 그러나 올바른 접근 방법입니다. * 편집 : * 당신이 Github 예제에서 비슷한 것을하는 것을 볼 수 있습니다. –

+0

내 파일의 모든 텍스트를 여기에 배치하지 않습니다. 주된 것을 이해하기가 어려울 것이기 때문입니다. 나는 그것이 파일의 일부라고 썼다. 이 테스트를위한 모든 파일은 github에 배치되어 하나의 클래스 브랜치에 대한 새로운 커밋으로 배치됩니다. 나는 내 시험을 시험하고있어. 의견을 주셔서 감사합니다. – pofigizm

+0

자신의 질문에 답하는 것이 좋지만 첫 번째 질문 위에 다른 질문처럼 보이게하지 마십시오. –

관련 문제