SyntaxError:期望表达式,得到'<'

时间:2015-03-06 07:30:38

标签: javascript angularjs node.js express

当我执行以下节点代码

时,控制台出现SyntaxError: expected expression, got '<'错误
var express = require('express');
var app = express();
app.all('*', function (req, res) {
  res.sendFile(__dirname+'/index.html') /* <= Where my ng-view is located */
})
var server = app.listen(3000, function () {
  var host = server.address().address
  var port = server.address().port
})

错误: enter image description here

我使用Angular Js和它的文件夹结构如下文

enter image description here

我在这里失踪了什么?

13 个答案:

答案 0 :(得分:48)

此代码:

app.all('*', function (req, res) {
  res.sendFile(__dirname+'/index.html') /* <= Where my ng-view is located */
})

告诉Express,无论浏览器请求什么,您的服务器都应该返回index.html。因此,当浏览器请求jquery-x.y.z.main.jsangular.min.js等JavaScript文件时,您的服务器将返回index.html的内容,该内容以<!DOCTYPE html>开头,这会导致JavaScript错误。

回调中的代码应该查看请求以确定要发回的文件,和/或您应该使用与app.all不同的路径模式。有关详细信息,请参阅routing guide

答案 1 :(得分:10)

试试这个,通常对我有用:

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

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

目录public包含我的index.html并引用bower_components文件夹中的所有角度文件。

我相信express.static部分正确地提供静态文件(index.html引用的.js和css文件)。根据您的代码判断,您可能需要使用此行:

app.use(express.static(__dirname));

因为看起来你所有的JS文件,index.html和你的JS服务器文件都在同一个目录中。

我想@ T.J。 Crowder试图说是使用app.route发送不同于index.html的不同文件,因为只使用index.html会让你的程序只查找.html文件并导致JS错误。

希望这有效!

答案 2 :(得分:8)

主要思想是以某种方式返回了HTML而不是Javascript。

原因可能是:

  • 错误路径
  • 资产本身

可能是由错误的资产预编译引起的。就我而言,由于编码错误,我发现了这个错误。

当我打开我的应用程序时,我看到了 application error Encoding::UndefinedConversionError at /assets/application.js

有完全回溯的错误格式为HTML而不是Javasript。

确保资产已成功预编译。

答案 3 :(得分:5)

我有同样的错误。在我的情况下

原因限制服务器上的资源,服务器正在发送登录页面而不是javascript页面。

解决方案:允许用户访问资源或删除限制。

答案 4 :(得分:3)

当你在html中放置一个内联标记时,你也可以得到这个错误信息,但是(对我来说很常见)拼写错误,你忘记将斜杠添加到closing-script标签,如下所示:

<script>
  alert("I ran!");
<script> <!-- OOPS opened script tag again instead of closing it -->

JS解释器尝试“执行”标记,该标记看起来像一个以小于号开头的表达式,因此出现错误:SyntaxError: expected expression, got '<'

答案 5 :(得分:0)

当我将Wordpress网站迁移到另一台服务器时,我遇到了同样的错误。 我的js脚本标题中的URL仍指向旧服务器和域名。

更新域名后,错误就消失了。

答案 6 :(得分:0)

我使用Angular js遇到了类似的问题。我在.htaccess中重写了所有index.html。 解决方案是添加正确的路径斜杠。 每种情况都是独特的,但希望这有助于某人。

答案 7 :(得分:0)

如果您的文件包含错误的路径并且服务器在加载文件时出现404错误,则会出现此问题。

答案 8 :(得分:0)

我使用经过身份验证的ASPNET应用程序解决了这个问题,方法是将webResource.axd添加为web.config上的一个位置,以便匿名用户授权

<location path="WebResource.axd">
  <system.web>
    <authorization>
      <allow users="?"/>
    </authorization>
  </system.web>
</location>

答案 9 :(得分:0)

只需添加:

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

其中'/app'是index.html所在的目录或您的Webapp。

答案 10 :(得分:0)

我在Django上遇到了这个类型的问题,我的问题是忘记将static添加到<script>标记。

例如在我的模板中:

<script  type="text/javascript"  src="css/layer.js"></script>

我应该像这样添加static

<script type="text/javascript" src="{% static 'css/layer.js' %}" ></script>

答案 11 :(得分:0)

这对你有用。如果你正在使用SPA。

app.use('/', express.static(path.join(__dirname, 'your folder')));
// Send all other requests to the SPA
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname, 'your folder/index.html'));
});

答案 12 :(得分:0)

可能对某人有帮助。我遇到的错误是

  

SyntaxError:期望的表达式,得到了'<'

我在chrome中点击了查看源代码,然后发现了这个错误

  

通知:未定义的变量:字符串    D:\ Projects \ demo \ ge.php 在第 66

问题是这段代码片段,

$string= ''; <---- this should be declared outside the loop

while($row = mysql_fetch_assoc($result))
    {
        $string .= '{ id:'.$row['menu_id'].', pId:'.$row['parent_id'].', name:"'.$row['menu_name'].'"},';
    }

解决了这个问题。