nodejs Webサーバーを実行すると、WebのルートはWebサーバーを実装するjsファイルを含むフォルダーであるという印象を受けました。したがって、C:\ foo \ server.jsがあり、それを実行すると、「/」はC:\ fooを参照し、「/ index.htm」はC:\ foo\index.htmにマップされます。
兄弟ファイルdefault.htmを含むファイルserver.jsがありますが、/ default.htmの内容を読み込もうとすると、ファイルが見つかりません。絶対ファイルパスが機能します。
「/」はどこにあり、何がこれを制御しますか?
再現を作成する私はそれをこれに単純化しました:
var fs = require('fs');
var body = fs.readFileSync('/default.htm');
これを探していることに気づきました
Error: ENOENT, no such file or directory 'C:\default.htm'
したがって、「/」はC:\にマップされます
Webルートのマッピングを制御する方法はありますか?
相対パスが機能していることに気付きました。それで
var fs = require('fs');
var body = fs.readFileSync('default.htm');
成功します。
私の混乱は、元の実験のプロジェクトファイルがドライブのルートに偶然に配置されたことから生じたと思います。これにより、/default.htmへの参照を正しく解決できました。この問題が明らかになったのは、ソース管理下に置くためにフォルダーに移動したときだけでした。
私は確かにエクスプレスを調べますが、あなたは私の質問に答えていません:ウェブルートを再マップすることは可能ですか?もしそうならどのように?
興味深いことに、これは現在のserver.jsです。
var http = require('http');
var fs = require('fs');
var sys = require('sys');
var formidable = require('formidable');
var util = require('util');
var URL = require('url');
var QueryString = require('querystring');
var mimeMap = { htm : "text/html", css : "text/css", json : "application/json" };
http.createServer(function (request, response) {
var body, token, value, mimeType;
var url = URL.parse(request.url);
var path = url.pathname;
var params = QueryString.parse(url.query);
console.log(request.method + " " + path);
switch (path) {
case "/getsettings":
try {
mimeType = "application/json";
body = fs.readFileSync("dummy.json"); //mock db
} catch(exception) {
console.log(exception.text);
body = exception;
}
break;
case "/setsettings":
mimeType = "application/json";
body="{}";
console.log(params);
break;
case "/":
path = "default.htm";
default:
try {
mimeType = mimeMap[path.substring(path.lastIndexOf('.') + 1)];
if (mimeType) {
body = fs.readFileSync(path);
} else {
mimeType = "text/html";
body = "<h1>Error</h1><body>Could not resolve mime type from file extension</body>";
}
} catch (exception) {
mimeType = "text/html";
body = "<h1>404 - not found</h1>" + exception.toString();
}
break;
}
response.writeHead(200, {'Content-Type': mimeType});
response.writeHead(200, {'Cache-Control': 'no-cache'});
response.writeHead(200, {'Pragma': 'no-cache'});
response.end(body);
}).listen(8124);
console.log('Server running at http://127.0.0.1:8124/');
「ルート」が何を意味するのか完全にはわかりませんが、setsettingsとgetsettingsはあなたが意図したようなものだと思います。間違っている場合は、訂正してください。
Nodejsは、Webルートの任意のマッピングをサポートしていないようです。
必要なのは、ファイルシステムで使用する前に絶対Webパスの前にピリオドを付けることだけです。
var URL = require('url');
var url = URL.parse(request.url);
var path = url.pathname;
if (path[0] == '/')
path = '.' + path;