Javascript express.js中的url解析

Javascript express.js中的url解析,javascript,node.js,express,Javascript,Node.js,Express,我试图在我的节点服务器上学习express.js,并尝试将同样的内容从http模块复制到express框架中 进一步解释: 在我开始使用express之前,我使用了第一个代码,在express中,我在“site”文件夹中有一个文件树,其中包含以下网页 e: |_node.js |_node_modules |_site | |_abc | | |_123.html | | |_456.html | | |_789.html | |_cde | |

我试图在我的节点服务器上学习express.js,并尝试将同样的内容从http模块复制到express框架中

进一步解释: 在我开始使用express之前,我使用了第一个代码,在express中,我在“site”文件夹中有一个文件树,其中包含以下网页

e:
|_node.js
   |_node_modules
   |_site
   | |_abc
   | | |_123.html
   | | |_456.html
   | | |_789.html
   | |_cde
   | | |_123.html
   | | |_456.html
   | | |_789.html
   | |_abc.html
   | |_cde.html
   |_server.js
我通常只需要让localhost:8080/abc/123获取/site/abc/123.html,就可以在url中访问它们

var http = require('http');
var url = require('url');
var fs = require('fs');
var port = 8080;

http.createServer(function (req, res) {
  var q = url.parse(req.url, true);
  var filename = "./site" + q.pathname + ".html";
  fs.readFile(filename, function(err, data) {
    if (err) {
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }  
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.write(data);
    return res.end();
  });
}).listen(port);
console.log('Running on port ' + port);

在这里,我试着这样做

var url = require('url');
var fs = require('fs');
var express = require('express');
var app = express();
var port = 8080;
var site = "/site"

app.get('*', function (req, res) {
  var q = url.parse(req.url, true);
  var filename = site + q.pathname + ".html";
    fs.readFile(filename, function(err, data) {
    if (err) {
      console.log(err);
      res.writeHead(404, {'Content-Type': 'text/html'});
      return res.end("404 Not Found");
    }  
    res.writeHead(200, {'Content-Type': 'text/html'});
      res.sendFile(filename, { root: __dirname + site } );
    return res.end();
  });
})

var server = app.listen(port, function () {
    console.log('Running on port ' + port);
})
但是现在使用express框架,当我键入localhost:8080/abc/123时,它只返回404notfound 打字时

显然,错误包含

{[Error: ENOENT: no such file or directory, open 'e:\site\abc.html']
errno: -4058,
code: 'ENOENT',
syscall: 'open',
path: 'e:\\site\\abc.html'}
完整路径应该是

e:\node.js\site\abc.html

而server.js位于 e:\node.js

为什么它会在e:而不是e:\node.js处跳回


现在我猜是“root:u dirname”导致了错误,我应该用什么来替换它,使它从e:/node.js而不是e:?

这可能不是唯一的问题,但有一点是

app.get(“/”。。。
将只匹配根url,因此它将匹配
localhost:8080/
,但不匹配
localhost:8080/foo
或任何其他路径

app.get

要匹配您需要执行的任何操作:

app.get('/*'。。。
或者,如果只想匹配以某个段开头的路径,可以执行以下操作:

app.get(“/some path/*”。。。
这将匹配
localhost:8080/some path/
localhost:8080/some path/foo
localhost:8080/some path/bar

编辑:

至于为什么会得到错误的文件路径,如果仔细查看,您会发现您仅在尝试发送文件时使用
\uu dirname
,而在阅读文件时却没有使用该文件!

所以你有:

var filename = site + q.pathname + ".html";
    // This is not reading from the correct path -
    // it's missing __dirname!
    fs.readFile(filename, function(err, data) {
应该改成

var filename = __dirname + site + q.pathname + ".html";
    // This is now using __dirname which should be the
    // the directory of your server module
    fs.readFile(filename, function(err, data) {
然后再往下看,您不需要使用
sendFile
,因为变量中已经有
数据
,您可以使用与示例类似的代码:

res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
return res.end();
更改:

var site = "/site"
致:

root选项仅适用于相对文件名,但以“/”开头的路径对于文件系统的根是绝对路径

除非您需要对文件做更多的操作,否则如果您只为文件提供服务,最好使用express.static()为文件提供服务,该文件可以配置为不公开.html扩展名,如下所示:


你能编辑你的问题来澄清你到底期望什么和什么不起作用吗?现在还不清楚实际的问题是什么。更新了我的问题,很抱歉。在我开始使用express之前,我使用了第一个代码。在express中,我有一个文件树,其中有/abc/123.html、/cbe/234.html等网页,我通常在t中访问它们只需使用localhost:8080/abc/123来获取/abc/123.html,就可以创建url。但现在使用express框架,当我键入localhost:8080/abc/123时,它返回的是无法获取/abc/123。我尝试使用
app.get(“*”,…
但我只得到了404未找到,这意味着它将进入您的解析器?您应该能够通过打印
err
变量来调试您的视图,然后找出它找不到所需文件的原因。显然,错误包含“``{[错误:enoint:没有这样的文件或目录,请打开'e:\site\abc.html']errno:-4058,代码:'enoint',syscall:'open',path:'e:\\site\\abc.html'}``完整路径应该是e:\node.js\site\abc.html,server.js位于e:\node.js,为什么它会在e:'node.js跳回e:'而不是在e:\node.jsI更新了我的答案。您通常应该检查错误所在的行,假设它是在
res.sendFile上引发的(文件名,{root:_dirname+site}
但它可能是由
fs.readFile(文件名,函数(err,data))引发的{
这完全帮助了我。我缝合了一些搜索结果,最终使用了path模块,但是你的解决方案看起来比我的解决方案更干净整洁。谢谢!谢谢,但是现在我正在试图弄清楚为什么代码在http模块上工作,而不是在express上。但可以肯定的是,这在将来会很方便我编辑了答案,试图解决具体问题
var site = "site"