node.js - 由 Node.js 提供的 Angular 应用,无需 JS 脚本
问题描述
我用 node.js 服务器创建了一个 Angular 应用程序。当我在本地提供应用程序('ng serve')时,应用程序运行良好。但是,当我将 Angular 项目构建到“公共”文件夹中,并将 node.js 服务器设置为为应用程序的网页提供服务时,浏览器会将服务器提供的 HTML 代码显示为文本。
为页面提供服务的 node.js 代码如下:
const express = require('express')
const app = express()
const server = require('http').createServer(app)
const bodyParser = require('body-parser')
const cors = require('cors')
const path = require('path')
const fs = require('fs')
const authRouter = require('./src/middlewares/auth.js');
const roomRouter = require('./src/middlewares/room.js');
const controller = require('./src/middlewares/token.js');
const PORT = process.env.PORT || 8080;
///////////////////////////////////////
//////////// MIDDLEWARES //////////////
///////////////////////////////////////
app.use(bodyParser.json()) //Parsed data is populated on the request object (i.e. req.body).
app.use(bodyParser.urlencoded( { extended: true }))
app.use( (req, res, next ) => {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'Origin, Content-Type, X-Requested-With, Accept, x-access-token')
if (req.method == 'OPTIONS') {
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH')
}
res.header('Content-Type', 'application/json') //REST-API: we only send back json data
next()
})
app.use(express.static(path.join(__dirname, 'public')));
//////////////////////////////
///////// DATABASE ///////////
//////////////////////////////
const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/sync';
var db;
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
.then(client => {
console.log("connection to database established... ");
db = client.db("sync");
db.createCollection('users'); //Normally, if it already exists, it shoudn't do anything, but I'm not sure
app.use((req, res, next) => {
req.db = db
next();
})
})
.catch(err => {console.log(err)})
///////////////////
//// ROUTING //////
///////////////////
app.use('/api/auth', authRouter)
app.use('/api/room', roomRouter)
app.get('*', (req, res) => {
// res.setHeader('Content-Type', 'text/html')
res.sendFile(path.join(__dirname, 'public', 'index.html'));
// res.send('Hello')
});
///////////////////////////////////////
///////// SOCKET CONNECTION ///////////
///////////////////////////////////////
var sockets = [];
const io = require('socket.io').listen(server);
io.on('connection', (socket) => {
//socket.on...
//...
});
///////////////////////////////////////
///////// SERVER CONNECTION ///////////
///////////////////////////////////////
app.listen(PORT, () => {
console.log("Running on port " + PORT)
})
index.html 文件如下:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Client2</title>
<base href="/">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="icon" type="image/x-icon" href="favicon.ico">
</head>
<body>
<app-root></app-root>
<script src="runtime-es2015.js" type="module"></script>
<script src="runtime-es5.js" nomodule defer></script>
<script src="polyfills-es5.js" nomodule defer></script>
<script src="polyfills-es2015.js" type="module"></script>
<script src="styles-es2015.js" type="module"></script>
<script src="styles-es5.js" nomodule defer></script>
<script src="vendor-es2015.js" type="module"></script>
<script src="vendor-es5.js" nomodule defer></script>
<script src="main-es2015.js" type="module"></script>
<script src="main-es5.js" nomodule defer></script>
</body>
</html>
当我检查服务器提供的网页时,只发送 index.html 而不是链接到它的脚本,因此无法正确显示页面。就好像 express 不提供 javascript 文件一样。
解决方案
res.sendFile()
是一个发送文件的快速函数(https://expressjs.com/de/api.html#res.sendFile)。因此,标题将相应设置。使用 express 函数res.send()
正确设置响应并查看http://expressjs.com/en/starter/basic-routing.html。
更好的是:使用像 nginx 这样的简单 http-server 或 npm 工具 http-server 来实现您的服务目的。
推荐阅读
- c# - 当 mdi child 最大化时,Winforms 删除控制框项目
- algorithm - 使用快速排序算法对 K 排序数组进行排序的时间复杂度
- html - 如何使用 React 制作选择目录?
- javascript - 无法执行警报
- python - 如何在不使用更改后的按钮打开新窗口的代码的情况下更改按钮
- html - Bootstrap 4模式消失后背景仍然存在
- c# - 使用实体框架时如何填充导航属性
- java - 为什么 Java 允许在旧值和新值都为空时触发属性更改
- ios - 重新加载数据后,如何使 UICollectionView 从底部滚动聊天应用程序?
- bash - 如何在不破坏登录凭据检查的情况下处理 ORA-28002?