首页 > 解决方案 > express.js 中的 url 解析

问题描述

我正在尝试在我的节点服务器上学习 express.js,并尝试将相同的东西从 http 模块复制到 express 框架中。

进一步解释:在开始使用 express 之前,我使用的是第一个代码,其中我在“站点”文件夹中有一个文件树,其中包含网页,例如

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);
})

但是现在当我输入 localhost:8080/abc/123 时使用 express 框架,但在输入http://localhost:8080/abc时它只返回 404 Not Found

显然错误包含

{[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:__dirname”导致错误,我应该用什么替换它以便它从e:/node.js而不是e:开始?

标签: javascriptnode.jsexpress

解决方案


改变:

var site = "/site"

到:

var site = "site"

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

除非您需要对文件做更多的事情,如果您只是为它们提供服务,最好使用 express.static() 来为它们提供服务,可以将其配置为不公开 .html 扩展名,如此处回答:

https://stackoverflow.com/a/37990843/2106611


推荐阅读