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

これは、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コールバックの後半にはありません。

なぜだめですか?くそー-これはイライラします。

4

2 に答える 2

0

への呼び出しは、関数からresponse.endに移動する必要があります。現状では、ストリームが閉じられているため、phpServer は他に何も書き込むことができません。onRequestphpServer

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 に答える