【问题标题】:Default route in Express.jsExpress.js 中的默认路由
【发布时间】:2014-05-05 13:50:20
【问题描述】:

我正在用 node.js 和 express 编写一个应用程序。

我已经设置了一个默认路由:

app.get('/', function(req, res){
  res.sendfile('./views/index.html');
});

当我转到 /localhost:port/ 时,这工作正常

但是在那之后我在 URL 中输入任何内容时,/localhost:port/blah 我得到 404 ERROR,这是有道理的。

我想设置一个默认路由,这样无论我在 localhost:port/ 之后输入什么 URL,它都应该返回相同的 html 文件。

我尝试将 / 更改为 * :

app.get('*', function(req, res){
  res.sendfile('./views/index.html');
});

但是在我这样做之后,我开始在控制台中收到此错误并且什么都没有显示:

Uncaught SyntaxError: Unexpected token

在我所有的 Javascript 文件中::3000/scripts/myscript.js:1

我的 javascript 文件以某种方式显示了 HTML 的内容

===编辑====

我使用了这个,它在一级 url 上运行良好:比如 loclhost:port/blah

app.use(function(req, res){
    res.sendfile('./views/index.html');
});

但是当 URL 是多级的时,我看到了与前面描述的相同的问题 localhost:port/blah/foo 这里的问题是路由器在 /blah 文件夹下寻找所有 javascript 和 CSS 文件的公共目录,在这种情况下,它不存在。它正在返回默认的 HTML 文件。我该如何解决这个问题?

==================编辑发布整个代码======================== =================

var http = require('http');
var express = require('express');
var api = require('./routes/api');
var mongoose = require('mongoose');
var app = express();


mongoose.connect('mongodb://localhost/mydb');

app.set('port', process.env.PORT || 3000);
app.set('view engine', 'jade');

app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(app.router);

app.use(express.static(__dirname + '/public'));

app.get('/api/user/:userid', api.getUserInfo);

app.get('/', function(req, res){
  res.sendfile('./views/index.html');
});

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

除此之外,我还有一个带有 myscript 链接的 HTML,

<script type="text/javascript" src="./scripts/myscript.js" ></script>

【问题讨论】:

  • 你能把整个代码贴出来吗?
  • 您的站点正在加载您的 JS 文件,这些请求可能由您的“catch-all”.get '*' 提供。浏览器需要 JavaScript 文件,但会获取您的 index.html。这表明您并不真的希望所有的 URL 都使用 index.html。
  • 嗯。你会认为因为它是第一位的,所以app.use(express.static(__dirname + '/public')); 行应该优先。 ://
  • 那我该如何避免呢?

标签: javascript node.js express url-routing


【解决方案1】:

您之前的所有路线之后添加这条路线

app.get('*',function (req, res) {
        res.redirect('/');
    });

这会将任何未处理的路由重定向到索引“/”

【讨论】:

  • 这确实有效,但由于某种原因,request.url 总是包含“/”而不是指定的完整路径。
【解决方案2】:

here 所述,您可以在路由逻辑之后添加此中间件:

   app.use(function(req, res){
       res.send(404);
   });

您可能会发现this answer 也很有用。

当然,您需要调整res.send() 部分以满足您的需求。

【讨论】:

  • 我添加了这个 app.use(function(req, res){ res.sendfile('./views/index.html'); });它适用于 url/anything ,但仍然存在问题,当我在我的 url 中键入两个级别时,如 localhost:port/anything/anything 它会引发与上述相同的错误。
  • 好的问题是当我说 localhost:port/blah/anything 时,所有对 javascript 文件的 GET 请求都在不存在的 /blah 目录下,因此它正在返回 HTML 文件。
【解决方案3】:

对于新版本的 express,我建议使用 res.sendStatus,因为 res.send 已被弃用。

Express v3

app.use(function(req, res){
   res.send(404);
});

Express v4

app.use(function(req, res){
   res.sendStatus(404);
});

【讨论】:

  • 在 Express 4.x 中,如果您不想使用预定义的状态消息作为状态码(在本例中为 Not Found),也可以使用 res.status(404).send('Sorry, we cannot find that!')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 2016-03-27
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多