私はかなり経験豊富なプログラマーで、最近node.jsを発見しました。私はJavaScriptが大好きです。それは、私が始めた場所(Web開発)であり、JavaScriptを使用してサーバー側のコードを記述できることは素晴らしいことです。
現在、私は簡単な演習であるWebSocket / HTTPサーバーに取り組んでおり、少し煩わしいことに遭遇したときにディレクトリリスト関数を追加し始めました。特定のディレクトリにディレクトリとファイルをリストすると、それらはどのディレクトリにもありません。注文。最初にディレクトリ、アルファベット順よりもファイルの順にリストするようにします(「ls」コマンドのように)。非同期なので感じますが、完全にポジティブというわけではありません。どんな助けでもいただければ幸いです。
ところで、これが私のコードです:
var sys = require("sys");
var ws = require('websocket-server');
var fs = require("fs");
var path = require("path");
var url = require("url");
function log(data){
sys.log("\033[0;32m"+data+"\033[0m");
}
var server = ws.createServer();
server.listen(3400);
log("Listening on 3400 for HTTP and WS");
server.addListener("request", function(request, response){
log("HTTP: Connected: " + request.connection.remoteAddress);
var uri = url.parse(request.url).pathname;
var filename = path.join("/home/brandon", uri);
log("HTTP: " + request.connection.remoteAddress + " Requested: " + filename);
path.exists(filename, function(exists) {
if(!exists) {
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found\n");
log("HTTP: " + filename + " Does Not Exist. 404 returned to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
}
fs.readFile(filename, "binary", function(err, file) {
if(err) {
if(err.errno === 21){
fs.readdir(filename, function(err1, files){
if(err1){
response.writeHead(500, {"Content-Type": "text/plain"});
response.write("Error when reading directory: " + err1 + "\n");
log("HTTP: " + filename + " Could Not Be Read. 500 returned to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
} else {
response.writeHead(200);
response.write("<HTML><HEAD><title>Directory Listing for " + uri + "</title></HEAD><BODY><h1>Directory Listing for " + uri + "</h1>");
response.write("<ul>");
function printBr(element, index, array) {
response.write("<li>" + element + "</li>");
}
/*for( i in files ){
response.write("<li>" + files[i] + "</li>");
}*/
files.forEach(printBr);
response.write("</ul>");
response.write("</BODY></HTML>");
log("HTTP: Directory listing for " + filename + " sent to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
}
});
return;
}
response.writeHead(500, {"Content-Type": "text/plain"});
response.write("Error when reading file: " + err + "\n");
log("HTTP: " + filename + " Could Not Be Read. 500 returned to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
return;
}
response.writeHead(200);
response.write(file, "binary");
log("HTTP: " + filename + " Read and Sent to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
});
});
});
server.addListener("connection", function(conn){
log(conn.id + ": new connection");
server.broadcast("New Connection: "+conn.id);
conn.addListener("readyStateChange", function(readyState){
log("stateChanged: "+readyState);
});
conn.addListener("close", function(){
var c = this;
log(c.id + ": Connection Closed");
server.broadcast("Connection Closed: "+c.id);
});
conn.addListener("message", function(message){
log(conn.id + ": "+JSON.stringify(message));
server.broadcast(conn.id + ": "+message);
});
});
そして、ブラウザでの出力は次のとおりです。
**解決済み:**
@Samirのおかげで、自分がやりたいことを正確に行う方法を見つけました。ディレクトリの内容の配列を繰り返し処理し、アイテムがディレクトリまたはファイルであるかどうかを確認し、それらを2つの配列(dirsの場合は'dirs_in'、ファイルの場合は'files_in')に分割し、2つの配列をアルファベット順に並べ替え、最後に書き出しました。 。
コード(42〜70行目):
response.writeHead(200);
response.write("<HTML><HEAD><title>Directory Listing for " + uri + "</title></HEAD><BODY><h1>Directory Listing for " + uri + "</h1>");
response.write("<ul>");
function printBr(element, index, array) {
response.write("<li>" + element);
if( fs.statSync( path.join(filename + element) ).isDirectory() ){
response.write(" is a <b>dir</b>");
} else {
response.write(" is a <b>file</b>");
}
response.write("</li>");
}
var dirs_in = [];
var files_in = [];
function sep(element, index, array) {
if( fs.statSync( path.join(filename + element) ).isDirectory() ){
dirs_in.push(element);
} else {
files_in.push(element);
}
}
files.forEach(sep);
dirs_in.sort().forEach(printBr);
files_in.sort().forEach(printBr);
response.write("</ul>");
response.write("</BODY></HTML>");
log("HTTP: Directory listing for " + filename + " sent to " + request.connection.remoteAddress);
response.end();
log("HTTP: Disconnected: " + request.connection.remoteAddress);
ブラウザの出力:
PS「isadir」と「isafile」を削除します。それらはテスト用でした。