2015-07-25 12 views
6

Ich betreibe einen NodeJS-Server, der eine Catchall-Route verwendet, um eine Datei 'index.html' bereitzustellen. In dieser Datei verlinke ich zu einer Javascript-Datei im selben Verzeichnis. Diese Javascript-Datei wird nicht korrekt geladen. Der Fehler in meiner Konsole lautet 'Uncaught SyntaxError: Unexpected Token <', was nach der Untersuchung bedeutet, dass der Pfad zu meiner JS-Datei falsch ist. Die js-Datei befindet sich jedoch im selben Verzeichnis wie 'index.html', und ich verweise darauf wie folgt, was sollte korrekt sein?NodeJS + Express-HTML-Datei nicht geladen js-Datei?

Hier ist mein Code

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()); 

public/app/views/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> 

public/app/views/Test .js

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

Sollte das nicht "app.use (express.static (__ dirname + '/ public')) sein;'? –

+0

Das war das Problem, danke! Nur der fehlende __dirname. Offensichtlich bin ich ein Anfänger mit Express :(Habe gerade angefangen, es vor einer Woche zu lernen. –

Antwort

6

Sie sollten Ihre statischen Ordner wie diese

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

Auch gesetzt, Ihre HTML-Datei im/öffentlichen Ordnern aussehen wird mich für Ihre Skriptdatei. Sie müssen Ihrer index.html-Datei den richtigen Pfad zu Ihrer Skriptdatei geben.

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

Ja danke das war das Problem –

+1

Gern geschehen! –

4

Hier ist, was passiert:

  • Der Browser fordert /, die von Ihrem catchall Route reagiert wird, so wird es wieder index.html.

  • Der Browser sieht dann ein Skript in der html bei ./test.js, also interpretiert der Browser das als /test.js und stellt eine Anfrage dafür. Die express.static Middleware sucht nach public/test.js, die nicht existiert, also übergibt sie die Ausführung an die nächste definierte Route, die der Anfrage entspricht, die Ihre Catchall-Route ist. Dies bedeutet, dass HTML für die Javascript-Datei gesendet wird, daher der Fehler, den Sie sehen.

Also dieses Problem zu beheben, müssen Sie ./test.js den tatsächlichen relativen Pfad (./app/views/test.js) oder verwenden Sie einen absoluten Pfad (/app/views/test.js) um sicherzustellen, dass der richtige Weg, ganz gleich, was der Strompfad nicht verwendet wird, immer ändern ist .

Darüber hinaus müssen Sie dies ändern:

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

etwas wie folgt aus:

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

die sonst express.static Middleware wird ein Verzeichnis public von der Root-Partition sucht Namen und Sie werden das gleiche Problem mit der Catchall-Route haben, die html für Ihre Javascript-Dateianforderung liefert.

+0

Hallo, ich habe es gerade versucht und es hat nicht funktioniert. Ich habe es auch versucht ". /app/views/test.js "nur weil. Auch nicht funktioniert. –

+0

Das Problem war die fehlende __dirname Variable Danke. Sollte ich auch path.join innerhalb express.static verwenden? –

+1

Sie können, wenn Sie wollen. – mscdex