我的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;
调用php.phpServer每个请求响应作为第3个参数。
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出来并显示我的期望。
如何让对象响应通过,以便我可以在其上调用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回调中。
为什么不呢? 该死的 - 这令人沮丧。
答案 0 :(得分: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
}
正如response.end
对{{1}}
此方法向服务器发出信号,表示已发送所有响应标头和正文;该服务器应该认为此消息已完成。
答案 1 :(得分:0)
您的问题不在于参数传递,而在于基本的异步控制流程。 stat()
函数不会立即执行其工作。它的回调参数在完成后被调用。您基本上无法按照您的方式构建代码。相反,你的“phpServer”代码需要获取自己的回调参数,并在它完成工作后调用它。