Экспресс бросок неожиданного жетона "Отступ" - PullRequest
2 голосов
/ 14 января 2012

Я пытаюсь доставить статический HTML-файл, который использует jquery и другие библиотеки и я хочу знать, как сделать его с помощью экспресс.

Вот мой код 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) 

Я сделал начальный поиск в Google, но я не особо понял ... может кто-нибудь дать понять, что происходит. Спасибо

Ответы [ 3 ]

3 голосов
/ 16 августа 2013

только для тех, кто собирается, хотя это. Скорее всего, вы следуете примеру здесь.

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

и событие, если вы не заинтересованы и по-прежнему заинтересованы в обслуживании HTML-файлов. тогда все, что вам нужно сделать, это использовать ejs.

если ваш проект не использует шаблоны Jade, просто отредактируйте файл package.json из этого:

"jade": "*"

к этому

"ejs": "*"

и тогда все в порядке с следующей конфигурацией app.js:

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

app.set('view engine', 'html');

Конечно, порядок вещей важен.

3 голосов
/ 14 января 2012

Проблема заключается в соединении .html с движком нефритовых шаблонов. 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-файла, вы можете посмотреть на этот ответ .

2 голосов
/ 15 января 2012

res.render() будет обрабатывать "index.html" как шаблон и пытаться обработать его через шаблонизатор (jade.) Поскольку ваш HTML-файл не отформатированный шаблон (это просто статический HTML-файл), вы получаете ошибки.

Если вы хотите просто передать статический файл index.html, просто поместите его в статический каталог, объявленный в app.use(express.static(__dirname + '/public'));, и получите к нему прямой доступ. Файлы в статическом каталоге не обрабатываются заранее. Вам также может понадобиться настроить промежуточное программное обеспечение Express, если вы пытаетесь сделать что-то более сложное. Проверьте конец раздела Middleware на 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);
}); 
...