2013-01-19 4 views
-1
의 함수 개체 매개 변수를 전달하는 방법을

내 server.js는 php.phpServer에게 3 PARAM으로 응답 모든 요청을 호출자바 스크립트

// server.js - the outer server loop 
var http = require('http') 
, php = require("./phpServer"); 

function start() { 
    function onRequest(request, response) { 
     php.phpServer('D:/websites/coachmaster.co.uk/htdocs',request, response); 
     response.write('Ending'); 
     response.end(); 
    } 
    http.createServer(onRequest).listen(80); 
    console.log("Server started."); 
} 

exports.start = start; 

입니다.

phpServer에 포함됩니다. 그것을시피

// 
// phpServer.js - a generic server to serve static files and 
// 
var fs = require('fs') 
, pathfuncs = require('path') 
, url = require('url') 
, mimetypes = require('./mimetypes') 

function phpServer(root, request, response) { 
    // serve static or pass to php. 
    var data = url.parse(request.url); 
    var ext = pathfuncs.extname(data.pathname); 
    fs.stat(root+request.url, function(err, stat) { 
     if (err || !stat.isFile()) { // error or not file. 
      console.log('404'); 
      response.writeHead(404); 
      response.write('Not Found'); 
      return; 
     } 
     // exists - serve. 
     console.log("serve("+root+request.url+", mimetypes.mimetype("+ext+"))"); 
     response.writeHead(200, {'Content-Type': mimetypes.mimetype(ext)}); 
     response.write('Somethign to serve'); 
     // fs.createReadStream(root+request.url).pipe(response); 
    }); 
} 

exports.phpServer = phpServer 

가 응답 목적 및 참조에 의해 전달되며, 따라서 Response.Write를() 여기서 응답을 작성한다.

그렇지 않습니다. 여기서의 응답은 onRequest의 응답과 동일하지 않으므로 코드 나 내용이 아닌 phpServer의 아무 것도 브라우저로 보내지지 않습니다.

console.log가 나와서 내가 기대하는 바를 보여줍니다.

내가 쓸 수 있도록 전달 된 객체 응답을 얻으려면 어떻게해야합니까?

-------------이 ------------------- 나중에 추가

나는 주어진 대답을 적용하려고했습니다 server.is에 대한 코드는

// server.js - the outer server loop 
var http = require('http') 
, fs = require('fs') 
, pathfuncs = require('path') 
, url = require('url') 
, mimetypes = require('./mimetypes') 

function phpServer(root, request, res) { 
    // code adapted from page 118 of Smashing Node.js by Guillermo Rauch 
    // res is response provided to onRequest. 
    var data = url.parse(request.url); 
    var ext = pathfuncs.extname(data.pathname); 
    res.write('Start reply'); 
    fs.stat(root+request.url, function(err,stat) { 
     // define delayed callback - reponse in scope 
     if (err || !stat.isFile()) { // error or not file. 
      console.log('404'); 
      res.writeHead(404); 
      res.write('Not Found'); 
      res.end 
      return; 
     }; 
     // exists so serve. 
     console.log("serve("+root+request.url+", mimetypes.mimetype("+ext+"))"); 
     res.writeHead(200, {'Content-Type': mimetypes.mimetype(ext)}); 
     res.write('The file contents'); 
     res.end; 
    } // end callback, 
    ); // end fs.stat call. 
} // end phpServer 

function start() { 
    function onRequest(request, response) { 
     phpServer('D:/websites/coachmaster.co.uk/htdocs',request, response); 
    } 
    http.createServer(onRequest).listen(80); 
    console.log("Server started."); 
} 

exports.start = start; 

전혀 응답하지 않습니다. 시간 초과되었습니다. res.writeHead에 대한 호출 중 하나 이 실패합니다 그러나 입술 범위를 벗어나면,// ​​정의되지 않은 존재, 또는 재 전달 된 PARAM 경우 성공하지 않습니다.

그것은 성공 및 쓰기와 말 다음에, 그래서 제발 - 내가 뭘 잘못 했어.

파일이 없으면 시작 응답과 시간 초과가 표시됩니다.

res.write ('Start reply')에서; res는 응답 매개 변수이지만 나중에 fs.stat 콜백에 포함되지 않습니다.

왜 안 되니? 젠장 - 이것은 실망 스럽습니다.

+0

첫 번째 호출에서 res.writeHead를 암시 적으로 호출하기 때문에 두 번째 버전이 실패합니다. writeHead에 대한 가시적 호출이 이루어지면 사물이 손상됩니다."응답 시작"호출이 제거되면 두 번째 버전이 정상적으로 작동합니다. – Ian

답변

0

response.end에 대한 호출은 onRequest 함수에서 phpServer으로 이동해야합니다. PHP는 스트림이 닫힌 이후 다른 것을 쓸 수 없습니다.

function onRequest(request, response) { 
    php.phpServer('D:/websites/coachmaster.co.uk/htdocs',request, response); 

    // response.end(); // move this to phpServer 
} 

바와 같이 response.end

응답 헤더 및 본문을 모두 전송 한 서버로이 방법 신호용 documentation 설명; 해당 서버는이 메시지를 완료 한 것으로 간주해야합니다.

+0

시도해 봤는데 - 이제는 타임 아웃이 생겼다. (그리고 phpServer에서 보내지 않은 것이있다.) – Ian

+0

@ian phpServer 함수에서'response.write' 뒤에'response.end'를 넣었습니까? – lostsource

+0

예. 콜백은 phpServer의 최상위에서 정의 된 함수이고 작동하지 않습니다. 또한 copy.passted phpServer를 server.js에 복사하고 이름을 변경했습니다 - !!!! – Ian

0

매개 변수 전달과 관련된 문제는 기본 비동기 제어 흐름과 관련이 있습니다. stat() 기능은 즉시 작동하지 않습니다. 콜백 매개 변수는 완료되면 호출됩니다. 기본적으로 코드를 구조화 할 수 없습니다. 대신 "phpServer"코드는 자체 콜백 매개 변수를 가져와 작업을 마친 후에 호출해야합니다.

+0

답변 해 주셔서 감사합니다. 응답이 phpServer의 맨 아래에 정의 된 경우 전달 된 것과 동일한 응답이어야합니다. 그렇지 않으면 정의되지 않고 호출이 실패합니다. 분명히 내 생각이 엉망입니다 – Ian

+0

@Ian이 fs.stat ()'**는 즉시 반환 **합니다. 콜백은 기본 운영 체제가 결과를 반환 할 때 호출됩니다. 따라서 콜백의 코드가 호출되기 전에'response.end() '에 대한 호출이 발생합니다. – Pointy

관련 문제