javascript - 如何从 URL 中删除 # 和 Angular 构建和 nodejs 应用程序中的 404 重新加载问题?
问题描述
我有 Angular9 和 nodejs 应用程序。我正在做ng build --prod
生产构建并将该构建文件放在 nodejs 公用文件夹中,现在我可以完美地访问该页面。
但我的问题在于我想删除 #. 目前我得到了
我使用一些技术来克服这个问题,就像我使用的那样
{useHash: false}
PathLocationStrategy
:使用这个我做了角度构建并将构建文件夹放在Nodejs公共文件夹中。并且在 url # 中没有显示。但是当我尝试重新加载时,它显示 404 not found 错误。
我知道在 Nodejs 代码中需要添加一些额外的东西。但我不知道该怎么做。我检查了很多解决方案,但无法解决这个问题
我希望 URL 不附加 # 并且如果我刷新它不应该抛出任何 404 错误。谁能指导我如何解决这个问题?
项目结构:
NodeJs 代码 index.js
const express = require('express')
require('./db/mongoose')
const bodyParser = require('body-parser')
const path = require("path")
const app = express()
const port = process.env.PORT || 8080
let blogRouter = require('./routes/blogRouter');
app.use(express.static(path.join(__dirname, '/public/dist/blog-ui')))
app.use(bodyParser.urlencoded({ extended: 'true' }))
app.use(bodyParser.json({ limit: "50mb" }))
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, x-token, authorization");
res.header("Access-Control-Expose-Headers", "x-token, authorization");
res.header("Access-Control-Allow-Methods", "PUT, POST, DELETE, GET, OPTION");
next();
});
app.listen(port, () => {
console.log(`Server listening on ${port}... `)
});
app.get('/*', (req, res) => res.sendFile(path.join(__dirname)));
app.use('/api/v1/blog', blogRouter);
解决方案
我找到了一个 npm 包,它使用浏览器历史记录来加载页面。这是解决我的上述问题。
Npm 包:https ://www.npmjs.com/package/connect-history-api-fallback
我在代码中遵循的内容:
角应用:
- 从我的代码中删除了 HashLocationStrategy、LocationStrategy 和 { useHash: true }。我的意思是不添加任何用于解决重新加载问题并且在 URL 中附加 # 的代码。我删除了这个相关的代码。
构建: ng build --prod
将 dist 文件夹复制到 nodejs 公用文件夹
Node 和 Express Js 项目变更:
我刚刚更改了 index.js 文件。
- 安装在 npm 包之上:
npm i connect-history-api-fallback --save
- index.js 中的代码是否更改。下面我在 index.js 中添加的代码
我在 Index.js 中所做的更改
const history = require('connect-history-api-fallback');
const staticFileMiddleware = express.static(path.join(__dirname, '/public/dist/blog-ui'));
app.use(staticFileMiddleware);
app.use(history({
disableDotRule: true,
verbose: true
}));
app.use(staticFileMiddleware);
Index.js 完整代码
const express = require('express')
require('./db/mongoose')
const bodyParser = require('body-parser')
const path = require("path")
const app = express()
const port = process.env.PORT || 8080
const history = require('connect-history-api-fallback');
let blogRouter = require('./routes/blogRouter');
const staticFileMiddleware = express.static(path.join(__dirname, '/public/dist/blog-ui'));
app.use(staticFileMiddleware);
app.use(history({
disableDotRule: true,
verbose: true
}));
app.use(staticFileMiddleware);
app.use(bodyParser.urlencoded({ extended: 'true' }))
app.use(bodyParser.json({ limit: "50mb" }))
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, x-token, authorization");
res.header("Access-Control-Expose-Headers", "x-token, authorization");
res.header("Access-Control-Allow-Methods", "PUT, POST, DELETE, GET, OPTION");
next();
});
app.listen(port, () => {
console.log(`Server listening on ${port}... `)
});
app.get('/*', (req, res) => res.sendFile(path.join(__dirname)));
app.use('/api/v1/blog', blogRouter);
推荐阅读
- rest - 如何通过 REST API 从 TFS 2018 U2 获取 TestPlan
- javascript - 如何知道用户是否在输入中添加或删除字符
- zsh - OSX launchctl ZSH Shell 脚本不等待外部程序完成
- testing - 如果我们在圆周图中有多个开始和停止会发生什么
- node.js - 使用 Typescript 和 JSForce 的 Webpack 编译错误
- python-3.x - 在python中调用函数时没有文件错误
- google-cloud-ml - 从自定义预测类中获取正在运行的项目 ID
- php - PHP如何从相同的字符串创建相同的哈希?
- javascript - 单击按钮时显示不同的组件
- jquery - Rotate Parent Div's 移动子 Div 的位置