为什么这不起作用,你如何在nodejs中调试代码?

时间:2015-03-04 03:46:12

标签: node.js

首先,我正在尝试学习nodejs,为此我正在编写路由器。正如你所表达的那样。

这是我的代码:

function sirus() {
    var util = utilFuncs(),
        paths = {};
    this.router = util.handleReq;
    this.con = {
        get: function (path, fn, options) {
            options = (options || {}).method = "GET";
            util.makeRequest(path, fn, options);
        },
        post: function (path, fn, options) {
            options = (options || {}).method = "POST";
            util.makeRequest(path, fn, options);
        }
    };
    this.req = {
        get: function (path, fn) {
            util.addPath("GET", path, fn);
        },
        post: function (path, fn) {
            util.addPath("POST", path, fn);
        }
    };

    function utilFuncs() {
        function handleReq(req, res) {
            var url = parsePath(req.url);
            var path = paths[req.method + url];
            // console.log(req.url, url +' requested');
            if (typeof path != "function") {
                res.writeHead(404);
            } else {
                path(req, res);
            }
            res.end();
        }

        function addPath(type, path, callback) {
            // add path as a key of object for easier look up, root=/, /a=/a, /a/=/a, /a?=/a, /a/?..=/a so there are no duplicates path=parsePath(path);
            paths[type + path] = callback;
        }

        function parsePath(path) {
            path = url.parse(path).pathname;
            if ((/[^\/]+\/(?=$)/igm).test(path)) path = path.substring(0, path.length - 1);
            return path;
        }

        function makeRequest(path, fn, options) {
            var urls = url.parse(path);
            var d = {
                host: null,
                hostname: null,
                method: "GET",
                path: '/',
                port: 80,
                headers: {},
                auth: null,
                agent: false,
                keepAlive: false
            };
            for (var k in options) d[k] = options[k];
            d.host = urls.host;
            d.hostname = urls.hostname;
            d.path = urls.pathname;
            d.headers['Content-Type'] = 'application/x-www-form-urlencoded';
            d.headers['Content-Length'] = ((d || {}).body || {}).length || '';
            var req = http.request(options, function (res) {
                // console.log('STATUS: ' + res.statusCode);
                // console.log('HEADERS: ' + JSON.stringify(res.headers));
                res.setEncoding('utf8');
                var data = '';
                res.on('data', function (chunk) {
                    data += chunk;
                });
                res.on('end', function (chunk) {
                    data += chunk;
                });
                res.on('response', function () {
                    fn(res);
                });
            });
            req.on('error', function (e) {
                console.log('problem with request: ' + e.message);
            });
            req.write(d.body);
            req.end();
        }
        return {
            makeRequest: makeRequest,
            handleReq: handleReq,
            addPath: addPath
        };
    }

}

我这样使用它:

var http = require('http'),
    url = require('url'),
    app = new sirus();

http.createServer(function (req, res) {
    app.router(req, res);
}).listen(80, '127.0.0.1');


app.req.get('/', function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    var link = "https://www.reddit.com/";
    res.write('<a href="' + link + '">Click here</a>');
});

app.con.get('http://www.google.com/', function (res) {
    console.log('from req: ' + res);
});

我得到的错误是第一个参数必须是字符串或缓冲区 接收部分工作正常,但当我开始添加make request部分时,某些东西是不对的。

此外,因为我是JS和Nodejs的新手。我想要一般的建议或任何引起你注意的东西,我可以改进这个代码。因为我注意到我确实以最好的方式做事。

2 个答案:

答案 0 :(得分:1)

第85行

req.write(d.body);

“d”对象中没有名为“body”的成员。

答案 1 :(得分:0)

1 - 为什么这不起作用 - 你得到的确切错误告诉你它为什么不起作用。如果您查看有关错误的更多详细信息,则会显示该文件以及发生的行错误。也许你传递给函数调用的参数不是Express所期望的。

2 - 如何调试 - 查看名为nodev的node.js包。