【问题标题】:Express throwing unexpected token "indent"快递抛出意外的令牌“缩进”
【发布时间】:2012-02-10 09:16:21
【问题描述】:

我正在尝试提供一个使用 jquery 和其他库的静态 html 文件 我想知道如何处理他的快递。

这是我的 app.js 代码(快速服务器文件)

var express = require('express') 
 , routes = require('./routes') 
var app = module.exports = express.createServer(); 
app.configure(function(){ 
 app.set('views', __dirname + '/views'); 
 app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function(){ 
 app.use(express.errorHandler({ dumpExceptions: true, showStack: 
true })); 
}); 

app.configure('production', function(){ 
 app.use(express.errorHandler()); 
}); 

app.register('.html', require('jade')); 
app.get('/', function(req, res) { 
   res.render('index.html'); 
}); 

app.listen(3000); 

我的 index.html 是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http:// 
www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html> 
<head> 
<link rel='stylesheet' type='text/css' href='theme.css' /> 
<link rel='stylesheet' type='text/css' href='fullcalendar.css' /> 
<link rel='stylesheet' type='text/css' href='fullcalendar.print.css' 
media='print' /> 
<script type='text/javascript' src='jquery-ui-1.8.11.custom.min.js'></ 
script> 
<script type='text/javascript' src='jquery-1.5.2.min.js'></script> 
<script type='text/javascript' src='fullcalendar.min.js'></script> 
<script type='text/javascript'> 
       $(document).ready(function() { 
               $('#calendar').fullCalendar({ 
                       theme: true, 
                       header: { 
                               left: 'prev,next today', 
                               center: 'title', 
                               right: 'month' 
                       }, 
                       editable: true, 
                       events: { url : 'http://localhost:5555/'}, 
                       firstDay : 1, 
                       weekends : true 
               }); 
       }); 
</script> 
<style type='text/css'> 
       body { 
               margin-top: 40px; 
               text-align: center; 
               font-size: 13px; 
               font-family: "Lucida 
Grande",Helvetica,Arial,Verdana,sans-serif; 
               } 
       #calendar { 
               width: 900px; 
               margin: 0 auto; 
               } 
</style> 
</head> 
<body> 
<div id='calendar'></div> 
</body> 
</html> 

当我运行我的服务器并将浏览器指向它时,我得到以下错误

Error: D:\Workspace\nodejs\test\my-server/views/index.html:12 
   10| <script type='text/javascript'> 
   11| 
 > 12|         $(document).ready(function() { 
   13| 
   14|                 $('#calendar').fullCalendar({ 
   15|                         theme: true, 
unexpected token "indent" 
   at Object.parseExpr (D:\Workspace\nodejs\test\my-server 
\node_modules\jade\lib\parser.js:228:15) 
   at Object.parse (D:\Workspace\nodejs\test\my-server\node_modules 
\jade\lib\parser.js:129:25) 
   at parse (D:\Workspace\nodejs\test\my-server\node_modules\jade\lib 
\jade.js:101:62) 
   at Object.compile (D:\Workspace\nodejs\test\my-server\node_modules 
\jade\lib\jade.js:148:9) 

我做了最初的谷歌搜索,但想不出来多少.. 有人能告诉我发生了什么吗? 谢谢

【问题讨论】:

    标签: node.js express pug


    【解决方案1】:

    仅适用于正在经历此问题的任何人。 您很可能正在按照此处的示例进行操作。

    https://github.com/visionmedia/express/blob/master/examples/ejs/index.js
    

    如果您没有并且仍然对提供 html 文件感兴趣,则可以参加活动。那么你需要做的就是使用ejs。

    如果您的项目没有使用玉模板,那么只需编辑您的 package.json 文件:

    "jade": "*"
    

    到这里

    "ejs": "*"
    

    然后您就可以使用以下 app.js 配置了:

    app.engine('.html', require('ejs').__express);
    
    app.set('view engine', 'html');
    

    确定顺序很重要。

    【讨论】:

    • @Legendre 很高兴它有帮助:)
    【解决方案2】:

    res.render() 会将“index.html”视为模板并尝试通过模板引擎 (jade) 处理它。因为您的 HTML 文件不是格式化模板(它只是静态 HTML 文件),您会遇到错误。

    如果你想简单地提供静态文件 index.html,只需将它放在 app.use(express.static(__dirname + '/public')); 中声明的静态目录中并直接访问它。静态目录中的文件未进行预处理。如果您尝试做一些更复杂的事情,您可能还需要配置 Express 中间件。查看中间件部分的末尾http://expressjs.com/guide.html#middleware

    您还可以使用 fs 模块读取文件内容并提供服务(这看起来就是您当前正在尝试做的事情),但这会带来不必要的开销:

    //var fs = require('fs');
    app.get('/html', function(req, res) { 
      res.writeHead(200, {'Content-Type': 'text/html'});
      var contents = fs.readFileSync("./public/index.html", "UTF-8");
      res.end(contents);
    }); 
    

    【讨论】:

      【解决方案3】:

      问题在于.html与jade模板引擎的连接。 Jade 要求 'html' 文件看起来像这样:

      !!! 5
      html(lang="en")
        head
          title= pageTitle
          script(type='text/javascript')
            if (foo) {
               bar()
            }
        body
          h1 Jade - node template engine
          #container
            - if (youAreUsingJade)
              p You are amazing
            - else
              p Get on it!
      

      在您的情况下,玉引擎会尝试将您的 HTML 文件解析为玉模板并阻塞。如果你真的想服务一个纯 HTML 文件,你可以看看at this answer

      【讨论】:

      • 我看过那篇文章,但也没有用……尽管从文件系统中读取是有效的。使用 (fs.readfile) 。我想知道是否有一种只提供 html 文件的简单方法。
      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-11
      • 2013-12-21
      • 1970-01-01
      相关资源
      最近更新 更多