J'avais l'impression que lorsque vous utilisez un serveur web nodejs, la racine du web est le dossier contenant le fichier js implémentant le serveur web. Donc si vous avez C: \ foo \ server.js et que vous l'exécutez, "/" fait référence à C: \ foo et "/index.htm" à C: \ foo \ index.htmnodejs web root
J'ai un fichier server.js avec un fichier frère default.htm, mais lorsque j'essaie de charger le contenu de /default.htm, le fichier est introuvable. Un chemin de fichier absolu fonctionne.
Où est "/" et que contrôle-t-il?
Travailler un repro Je l'ai simplifié à ceci:
var fs = require('fs');
var body = fs.readFileSync('/default.htm');
et remarqué qu'il cherche ce
Error: ENOENT, no such file or directory 'C:\default.htm'
Alors "/" cartes à C: \
Existe-t-il un moyen de contrôler le mappage de la racine Web?
Je remarque que les chemins relatifs fonctionnent. Ainsi,
var fs = require('fs');
var body = fs.readFileSync('default.htm');
réussit. Je crois que ma confusion est née du placement accidentel des fichiers de projet de mon expérience originale à la racine d'un lecteur. Cela a permis des références à/default.htm pour résoudre correctement; Ce n'est que lorsque j'ai déplacé les éléments dans un dossier pour les placer sous le contrôle de la source que ce problème a été révélé.
Je vais certainement regarder en express, mais vous n'avez pas répondu à ma question: est-il possible de remapper la racine web et si oui comment?
En intérêt est ce server.js tel qu'il est actuellement
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/');
Je ne suis pas tout à fait certain de ce que vous entendez par « voies », mais je pense que setSettings et getsettings sont le genre de chose tu voulais dire, corrigez-moi si je me trompe. Nodejs ne semble pas prendre en charge le mappage arbitraire de la racine Web.
Tout ce qui est nécessaire est de préfixer chemins web absolus avec une période avant de les utiliser dans le système de fichiers:
var URL = require('url');
var url = URL.parse(request.url);
var path = url.pathname;
if (path[0] == '/')
path = '.' + path;
Pouvez-vous publier le contenu du fichier server.js? –