如何将对象参数传递给JavaScript中的函数

时间:2013-01-19 14:18:29

标签: javascript node.js

我的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回调中。

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

2 个答案:

答案 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”代码需要获取自己的回调参数,并在它完成工作后调用它。