私のserver.jsは
// 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;
これは、3番目のパラメーターとして応答を使用してすべての要求に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はオブジェクトであり、参照によって渡されるため、ここでのresponse.write()は応答に書き込む必要があります。
そうではありません。ここでの応答はonRequestの応答と同じではないため、phpServerの何もブラウザに送信されません。コードもコンテンツも送信されません。
console.logsが出てきて、私が期待することを示しています。
オブジェクトの応答を渡して、writeを呼び出すにはどうすればよいですか?
-------------後で追加-------------------
与えられた回答と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コールバックの後半にはありません。
なぜだめですか?くそー-これはイライラします。