2013-01-19 34 views
-1

我server.js是如何通過目標函數的參數在JavaScript

// 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; 

這就要求php.phpServer與響應是第三個參數的每個請求。

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.logs出來展示一下我所期望的。

我怎樣才能獲得通過使物體響應我可以調用它寫?

-------------稍後添加-------------------

我試過應用給出的答案與代碼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的調用將會失敗,如果res超出範圍/不存在/未定義,或者如果re是參數傳入,則成功。

它成功了,接着是寫入和結束,所以請 - 我有什麼錯誤的。

如果文件不存在,我得到一個開始回覆,然後超時。

在res.write( '開始回覆'); res是響應參數,但它不晚於fs.stat回調。

爲什麼不呢? 該死的 - 這令人沮喪。

+0

第二個版本會失敗,因爲隱式地寫第一個電話呼叫res.writeHead - 所以作出writeHead可視呼叫時,事情已損壞。當「開始回覆」呼叫被移除時,第二個版本可以正常工作。 – Ian

回答

0

致電response.end應該從onRequest函數移動到phpServer。由於流已關閉,phpServer無法寫入任何其他內容。

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

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

documentation解釋爲response.end

此方法的信號,所有的響應報頭和主體的已發送所述服務器;該服務器應該認爲此消息已完成。

+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

@Is the call to'fs.stat( )'**立即返回**。當底層操作系統開始返回結果時調用回調。因此,在調用回調代碼之前,您對'response.end()'的調用發生**。 – Pointy

相關問題