我正在快速服务器中构建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
),因为它也匹配/*
路径
现在出现了新的更新问题:如何仅为路由中的“公共”文件设置例外?
答案 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会为您执行此操作。
现在你终于发布了整个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) { ... });