NodeJS + Express服务HTML文件不加载js文件?

我正在运行一个NodeJS服务器,它使用一个catchallpath来提供一个文件'index.html'。 在该文件中,我链接到同一个目录中的JavaScript文件。 该JavaScript文件未被正确加载。 在我的控制台中的错误读取'未捕获SyntaxError:意外令牌<',后研究似乎意味着我的JS文件的path是不正确的。 但是,js文件与“index.html”位于同一个目录,而且我正在引用它,应该是正确的?

这是我的代码

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> 

公共/应用/视图/ test.js

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

你应该像这样设置你的静态文件夹

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

另外,你的HTML文件将会在/ public文件夹里面查看你的脚本文件。 你需要给你的index.html文件的脚本文件的正确path。

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

这是发生了什么事情:

  • 浏览器请求/ ,这是你的catchall路线回应,所以它得到的index.html

  • 然后,浏览器在./test.js的html中看到一个脚本,然后浏览器将其解释为/test.js并提出请求。 express.static中间件查找public/test.js ,它不存在,所以它将执行传递到匹配请求的下一个定义的路由,这是您的catchall路由。 这意味着HTML被发送到JavaScript文件,因此你看到的错误。

所以要解决这个问题,你需要将./test.js改为实际的相对path( ./app/views/test.js )或者使用绝对path( /app/views/test.js )来确保正确path总是被使用,不pipe当前path是什么。

另外,你需要改变这个:

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

像这样的东西:

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

否则, express.static中间件会从您的文件系统的根目录中寻找一个名为public的目录,并且您的javascript文件请求将为HTML提供相同的问题。