node.js url模块编程困境

时间:2015-04-06 20:39:36

标签: javascript node.js express frameworks platform

我无法在nodeJS中运行文件get_params.js。 get_params.js的代码如下。其他js文件好玩。这是我在nodeJS的第一次经历,我还不知道具体的原因。我知道这不是NodeJS安装故障......也许是url模块的东西。那是对的吗?我知道http模块和fs模块工作时间很好,类似于这篇文章中的代码,但不完全像这段代码......而且我怎么知道它不是nodejs错误,而是这段代码中的东西。这段代码是由作者写的,所以我不知道究竟是什么错。他的其他代码工作正常。

var http = require('http'),
  fs = require('fs'),
  url = require('url');


function load_album_list(callback) {
// we will just assume that any directory in our 'albums'
// subfolder is an album.
fs.readdir(
    "albums",
    function (err, files) {
        if (err) {
            callback(make_error("file_error",  JSON.stringify(err)));
            return;
        }

        var only_dirs = [];

        (function iterator(index) {
            if (index == files.length) {
                callback(null, only_dirs);
                return;
            }

            fs.stat(
                "albums/" + files[index],
                function (err, stats) {
                    if (err) {
                        callback(make_error("file_error",
                                            JSON.stringify(err)));
                        return;
                    }
                    if (stats.isDirectory()) {
                        var obj = { name: files[index] };
                        only_dirs.push(obj);
                    }
                    iterator(index + 1)
                }                    
            );
        })(0);
    }
 );
 }

 function load_album(album_name, page, page_size, callback) {
 fs.readdir(
    "albums/" + album_name,
    function (err, files) {
        if (err) {
            if (err.code == "ENOENT") {
                callback(no_such_album());
            } else {
                callback(make_error("file_error",
                                    JSON.stringify(err)));
            }
            return;
        }

        var only_files = [];
        var path = "albums/" + album_name + "/";

        (function iterator(index) {
            if (index == files.length) {
                var ps;
                // slice fails gracefully if params are out of range
                ps = only_files.splice(page * page_size, page_size);
                var obj = { short_name: album_name,
                            photos: ps };
                callback(null, obj);
                return;
            }

            fs.stat(
                path + files[index],
                function (err, stats) {
                    if (err) {
                        callback(make_error("file_error",
                                            JSON.stringify(err)));
                        return;
                    }
                    if (stats.isFile()) {
                        var obj = { filename: files[index], 
                                    desc:   files[index] };
                        only_files.push(obj);
                    }
                    iterator(index + 1)
                }                    
            );
        })(0);
    }
     );
    }


  function handle_incoming_request(req, res) {

  // parse the query params into an object and get the path
  // without them. (2nd param true = parse the params).
  req.parsed_url = url.parse(req.url, true);
  var core_url = req.parsed_url.pathname;

  // test this fixed url to see what they're asking for
  if (core_url == '/albums.json') {
    handle_list_albums(req, res);
  } else if (core_url.substr(0, 7) == '/albums'
           && core_url.substr(core_url.length - 5) == '.json') {
    handle_get_album(req, res);
   } else {
    send_failure(res, 404, invalid_resource());
  }
  }

 function handle_list_albums(req, res) {
 load_album_list(function (err, albums) {
    if (err) {
        send_failure(res, 500, err);
        return;
    }

    send_success(res, { albums: albums });
  });
  }

 function handle_get_album(req, res) {

  // get the GET params
 var getp = req.parsed_url.query;
 var page_num = getp.page ? getp.page : 0;
 var page_size = getp.page_size ? getp.page_size : 1000;

 if (isNaN(parseInt(page_num))) page_num = 0;
 if (isNaN(parseInt(page_size))) page_size = 1000;

 // format of request is /albums/album_name.json
 var core_url = req.parsed_url.pathname;

 var album_name = core_url.substr(7, core_url.length - 12);
 load_album(
    album_name,
    page_num,
    page_size,
    function (err, album_contents) {
        if (err && err.error == "no_such_album") {
            send_failure(res, 404, err);
        }  else if (err) {
            send_failure(res, 500, err);
        } else {
            send_success(res, { album_data: album_contents });
        }
    }
  );
  }



 function make_error(err, msg) {
 var e = new Error(msg);
 e.code = err;
 return e;
 }

 function send_success(res, data) {
 res.writeHead(200, {"Content-Type": "application/json"});
 var output = { error: null, data: data };
 res.end(JSON.stringify(output) + "\n");
 }

 function send_failure(res, code, err) {
 var code = (err.code) ? err.code : err.name;
 res.writeHead(code, { "Content-Type" : "application/json" });
 res.end(JSON.stringify({ error: code, message: err.message }) + "\n");
 }


function invalid_resource() {
return make_error("invalid_resource",
                  "the requested resource does not exist.");
}

function no_such_album() {
return make_error("no_such_album",
                  "The specified album does not exist");
}


 var s = http.createServer(handle_incoming_request);
  s.listen(8080);

0 个答案:

没有答案