【问题标题】:Express routing - all routes allowed not working快速路由 - 允许的所有路由都不起作用
【发布时间】:2016-10-03 05:01:39
【问题描述】:

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

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

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

app.js:1 Uncaught SyntaxError: Unexpected token

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),因为它也匹配/*路由

现在更新的新问题是:如何只为路由中的那些“公共”文件设置异常?

【问题讨论】:

标签: node.js express routes vue.js


【解决方案1】:

在更详细地查看它之后,我可以说它看起来不像是 Node 错误,如果你在 app.js 的第一行有一个 "&lt;",那将是这样的:

$ 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 文件,但它获取的 HTML 与 JS 文件的内容相同,因为这是您为每个请求发送的内容,包括您的应用程序中可能引用的任何脚本.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,但文件不同。

【讨论】:

【解决方案2】:

尝试使用 for get 方法

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

或将其用于所有方法

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-13
    • 2019-06-08
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2018-10-04
    相关资源
    最近更新 更多