我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回調。
爲什麼不呢? 該死的 - 這令人沮喪。
第二個版本會失敗,因爲隱式地寫第一個電話呼叫res.writeHead - 所以作出writeHead可視呼叫時,事情已損壞。當「開始回覆」呼叫被移除時,第二個版本可以正常工作。 – Ian