【发布时间】:2020-06-03 03:36:38
【问题描述】:
我在调试这个问题时遇到了一些麻烦。我几乎有一个 Node.js,它为 React 应用程序提供服务,也充当 REST API。服务器默认运行在 8080 端口。
import express, {Request, Response} from 'express';
import path from 'path';
import helmet from 'helmet';
import morgan from 'morgan';
import webpack from 'webpack';
import webpackDevMiddleware from 'webpack-dev-middleware';
import webpackHotMiddleware from 'webpack-hot-middleware';
import {ENVIRONMENT, PORT} from '../util/secrets';
// Import API Routes
import * as home from './controllers/home';
// Create express server
const app = express();
// Add middleware
app.use(helmet());
app.use(morgan('combined'));
// Define API routes
app.get('/api/', home.get);
// Configure environment settings
if (ENVIRONMENT === 'development') {
// ...
} else {
// Configure Static Files (Production)
app.use(express.static("./"));
// Serve React Static Files (Production)
app.get('*', (req: Request, res: Response) => {
res.sendFile(path.resolve(__dirname, "/index.html"));
});
}
// Start server
app.listen(PORT, () => {
console.log(`Express started on http://localhost:${PORT}/ in ${ENVIRONMENT} mode.`);
});
export default app;
module.exports = app;
基本上我去 localhost:8080 并且我的应用程序渲染得很好。 但是当我转到 localhost:8080/login 时,我从服务器收到以下响应:
Error: ENOENT: no such file or directory, stat '/index.html'
/index.html
这里是摩根日志:
::ffff:172.17.0.1 - - [19/Feb/2020:03:01:18 +0000] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64
; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
::ffff:172.17.0.1 - - [19/Feb/2020:03:01:18 +0000] "GET /app.bundle.js HTTP/1.1" 304 - "http://localhost:8080/" "M
ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
"
Error: ENOENT: no such file or directory, stat '/index.html'
/index.html
::ffff:172.17.0.1 - - [19/Feb/2020:03:01:20 +0000] "GET /login HTTP/1.1" 404 195 "-" "Mozilla/5.0 (Windows NT 10.0
; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
为什么它在localhost:8080 上呈现我的应用程序而不是localhost:8080/login 上
Dist 文件夹:
dist
img
app.bundle.js
index.html
server.bundle.js
【问题讨论】:
-
您的服务器是在 3000 还是 8080 上运行的?你两个都提到了。
-
而且,当您请求
http://localhost:8080/login时,您期望会发生什么? -
@jfriend00 它在 8080 端口上运行,对此感到抱歉。
-
@jfriend00 我希望
http://localhost:8080/login返回与http://localhost:8080相同的结果。我希望 url 有 /login 以便 React Router 可以拾取新路由并更新当前视图。 -
不知道是不是webpack引起的?
http://localhost:8080有效,因为express.static()找到index.html,但http://localhost:8080/login与express.static()不匹配,因此它取决于您的*路由,也许 webpack 以某种方式搞砸了。
标签: node.js reactjs webpack react-router