快速路由 - 允许所有路由无法正常工作

时间:2016-06-03 08:03:49

标签: node.js express routes vue.js

我正在快速服务器中构建Vuejs应用程序。 我想显示所有路线的应用程序,然后我将在我的Vue应用程序路由器中管理这些路线。

如果我定义了一个像/home这样的独特路线,我的Vue应用程序会很好地显示,但当我将路由器定义为/*以允许所有路线时,渲染不起作用

router.get('/*', function (req, res) { 
    return res.render("application")
});
  

app.js:1 Uncaught SyntaxError:意外的标记<

application.html

<!DOCTYPE html>
<html>
<head>
    <title>My title</title>
</head>
<body>
<div id="app"></div>
<script src="public/app.js"></script>
</body>
</html>

错误是因为app.js读取为application.html文件(很奇怪)。但是,如果我定义了一条独特的路线(例如:/home),app.js的内容是正确的,我的应用就可以了。

以防万一: app.js

var express = require('express'), 
    app = express(),
    router = express.Router(),
    mustacheExpress = require('mustache-express') 

app.use(router)
app.engine('html', mustacheExpress());          
app.set('view engine', 'html');               
app.set('views', __dirname + '/views');
app.use('/public', express.static('public'));

router.get('/*', function (req, res) {  
     return res.render("application");
});

app.listen(9000)
module.exports = app; 

更新 正如@rsp所说,问题来自我的html文件中包含的脚本(app.js),因为它也匹配/*路径

现在出现了新的更新问题:如何仅为路由中的“公共”文件设置例外?

2 个答案:

答案 0 :(得分:1)

在更详细地查看之后,我可以说它看起来不像Node错误,如果"<"的第一行中有app.js,则会出现类似错误:

$ node app.js 
/tmp/node-test/app.js:1
(function (exports, require, module, __filename, __dirname) { <
                                                              ^

SyntaxError: Unexpected token <
    at exports.runInThisContext (vm.js:53:16)
    at Module._compile (module.js:413:25)
    at Object.Module._extensions..js (module.js:452:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:475:10)
    at startup (node.js:117:18)
    at node.js:951:3

而不只是:

app.js:1 Uncaught SyntaxError: Unexpected token <

正如您所写的那样,它看起来像是一个浏览器错误。您的HTML中是否有app.js,其中包含HTML而不是JavaScript作为其内容?

更新

我认为错误的是你的HTML试图加载一个JS文件,但它获得与JS文件内容相同的HTML,因为这是你为每个请求发送的内容,包括你的应用程序中可能引用的任何脚本html的。

而不是:

router.get('/*', function (req, res) { 
    return res.sendFile(__dirname + '/views/application.html')
});

尝试使用从该目录发送的静态文件:

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

并在浏览器中访问/application.html。

如果你的应用程序中有任何其他路线,它可能无效,但你不能这么说,所以很难推测。此外,如果您确切地显示了您想要访问的页面 - 例如http://localhost:3000/something - 那么您就会更容易知道自己要做什么。

另请参阅我在几个小时前发布过的类似问题的this answer。基本上,如果您为每个请求发送相同的文件,那么您还将发送相同的文件,以获取原始HTML文件中引用的其他脚本,图像等的任何请求。您需要确保在这种情况下发送正确的资产,express.static会为您执行此操作。

更新2

现在你终于发布了整个app.js,我发现了什么是错的。

尝试将其更改为:

var express = require('express'), 
    app = express();

app.use('/public', express.static('public'));
app.use('/', express.static('views'));

app.listen(9000)
module.exports = app;

或者,如果您可以移动静态文件,可以使其更简单:

尝试将其更改为:

var express = require('express'), 
    app = express();

app.use('/', express.static('public'));

app.listen(9000)
module.exports = app;

然后将您的html文件移至公开并更改:

<script src="public/app.js"></script>

到此:

<script src="app.js"></script>

建议

不要将两个文件命名为app.js,因为当您收到错误时会感到困惑。在答案的第一个版本中,您显示了关于HTML中引用的app.js浏览器代码的错误,但显示的节点代码的代码也名为app.js,但是文件不同。

答案 1 :(得分:0)

尝试使用get方法

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

或将其用于所有方法

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