-1

我的 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 每个请求,并将响应作为第三个参数。

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 超出范围/不存在/未定义,则对 res.writeHead 的调用将失败,或者如果 re 是传入的参数,则调用成功。

它成功了,然后是 write 和 end,所以请 - 我做错了什么。

如果文件不存在,我会收到一个开始回复,然后是超时。

在 res.write('开始回复'); res 是响应参数,但它不在 fs.stat 回调的后面。

为什么不?该死的——这令人沮丧。

4

2 回答 2

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

该方法向服务器发出所有响应标头和正文已发送的信号;该服务器应认为此消息已完成。

于 2013-01-19T14:24:17.253 回答
0

您的问题不在于参数传递,而在于基本的异步控制流。该stat()功能不会立即完成其工作。它的回调参数在完成时被调用。您基本上无法按照您的方式构建代码。相反,您的“phpServer”代码将需要自己的回调参数,并在它完成工作后调用它。

于 2013-01-19T14:25:52.667 回答