2015-07-25 2 views
6

Я запускаю сервер NodeJS, который использует общий путь для обслуживания файла 'index.html'. В этом файле я связываюсь с файлом javascript в том же каталоге. Этот файл javascript загружен неправильно. Ошибка в моей консоли гласит: «Неисследованный SyntaxError: Неожиданный токен <», который после исследования, похоже, неверен. Однако файл js находится в том же каталоге, что и «index.html», и я ссылаюсь на него так, чтобы это было правильно?NodeJS + Express обслуживал HTML-файл, не загружая js-файл?

Вот мой код

server.js

var express = require('express'); 
var app = express(); 
var config = require('./config'); 
var apiRouter = express.Router(); 
var mongoose = require('mongoose'); 
var bodyParser = require('body-parser'); 
var User = require('./app/models/User'); 
var jwt = require('jsonwebtoken'); 
var path = require('path'); 

//Set the public folder 
app.use(express.static('/public')); 

//Allows us to parse POST data. 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

mongoose.connect(config.db); 

var apiRouter = require('./app/routes/api')(app, express); 

app.use('/api', apiRouter); 

//MEAN apps use a catchall after any routes created by Node. 

app.get('*', function(req, res) { 
    res.sendFile(path.join(__dirname, 'public/app/views/index.html')); 
}); 

app.listen(1337); 

console.log('Server started at ' + Date()); 

общественности/приложение/просмотров/index.html

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <script src="./test.js"></script> 
<head> 
<body> 
    <h1>Served by node + express.</h1> 
</body> 
</html> 

общественности/приложение/просмотров/тест .js

console.log('test.js loaded'); 
+0

Не должно быть 'app.use (express.static (__ dirname + '/ public'));'? –

+0

Это была проблема: спасибо! Просто отсутствует __dirname. Очевидно, что я ноб с выражением :(Просто начал изучать его неделю назад. –

ответ

6

Вы должны установить статическую папку как этот

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

Кроме того, ваш HTML-файл будет выглядеть внутри/общественной самой папки для файла сценария. Вам нужно указать вашему файлу index.html правильный путь к вашему файлу скрипта.

<script src="/app/views/test.js"></script> 
+1

Да, спасибо, была проблема –

+1

Приветствую вас! –

4

Вот что происходит:

  • Браузер запрашивает /, который откликнулся на ваш Catchall маршрут, поэтому он получает обратно index.html.

  • Браузер затем видит скрипт в html по адресу ./test.js, поэтому браузер затем интерпретирует это как /test.js и делает запрос на это. Связующее ПО express.static смотрит вверх public/test.js, который не существует, поэтому он передает выполнение следующему определенному маршруту, который соответствует запросу, который является вашим полным маршрутом. Это означает, что html отправляется для файла javascript, следовательно, вы видите ошибку.

  • не

Так, чтобы исправить это, вам нужно изменить ./test.js фактического относительного пути (./app/views/test.js) или использовать абсолютный путь (/app/views/test.js), чтобы убедиться, что правильный путь всегда, независимо от того, что текущий путь ,

Кроме того, вам нужно будет изменить:

app.use(express.static('/public')); 

к чему-то вроде этого:

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

В противном случае express.static промежуточного слоя будет искать папку с именем public от корня вашей файловой системы и у вас будет такая же проблема с маршрутом catchall, обслуживающим html для вашего запроса файла javascript.

+0

Привет, я просто попробовал, и это не сработало. /app/views/test.js "просто потому, что также не работает. –

+0

Проблема заключалась в отсутствии переменной __dirname. Должен ли я также использовать path.join внутри express.static? –

+1

Вы можете, если хотите. – mscdex