node.js - Node 和reactjs axios服务器请求返回index.html文件而不是json

标签 node.js reactjs api express axios

我已经设置了我的项目,其中包含由 webpack 编译的 React 前端以及在 Node 和 Express 上运行的服务器。

当我部署到生产环境时,我对服务器的请求将返回“dist”文件夹中的 index.html 文件,而不是包含数据的 json。

我的 webpack 编译输出位于 ./dist 位置。

这是我的 server.js 文件的路由部分:

if (process.env.NODE_ENV === 'production') {
  app.use(express.static('dist'));
  const path = require('path');
  app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'dist', 'index.html'));
  });
}
// Use our router configuration when we call /
app.use('/', router);

这是我的 webpack 配置文件的一部分:

var HtmlWebpackPlugin = require('html-webpack-plugin');
var HTMLWebpackPluginConfig = new HtmlWebpackPlugin({
  template: __dirname + '/client/index.html',
  filename: 'index.html',
  inject: 'body'
});

module.exports = {
  entry: [
    './client/index.js'
  ],
  output: {
    path: __dirname + '/dist',
    filename: 'index_bundle.js'
  },
  devServer: {
    inline: true,
    contentBase: './dist',
    port: 8080,
    proxy: { '/api/**': { target: 'http://localhost:3000', secure: false } }
  },
  module: {
    loaders: [
      {test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader', query: {presets: ['es2015','react'], plugins: ['transform-es2015-destructuring', 'transform-object-rest-spread']}},
        {test: /\.jpe?g$|\.gif$|\.svg$|\.png$/i, loader: 'file-loader?name=/images/[name].[ext]'},
        {test: /\.css$/, loaders: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader','resolve-url-loader']},
        {test: /\.scss$/, loaders: ['style-loader', 'css-loader','postcss-loader', 'sass-loader','resolve-url-loader']}
        ]
  },
  plugins: [HTMLWebpackPluginConfig]
};

我的请求如下(api 路由/api/chefs 返回带有用户配置文件的 json(在开发中测试):

export function listChefs() {
  return function (dispatch) {
    axios.get('/api/chefs')
      .then((response) => {
        dispatch({
          type: LIST_CHEFS,
          payload: response.data
        });
      })
      .catch((err) => {
        errorHandler(dispatch, 'There was a problem. Please refresh and try again.');
      });
  };
}

似乎我使用 axios 从客户端发出的调用实际上命中了无法识别的 api url,因此被重定向到仅服务器 index.html 文件。

有什么帮助吗?

干杯

最佳答案

也许这是有问题的行:

app.get('/*', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'dist', 'index.html'));
});

因为这可以满足您的所有请求。如果将 /* 更改为 / 是否可以解决问题?

我认为请求无法到达您的路由器,因为 /* 捕获所有请求并返回 index.html 页面。

尝试:

app.get('/', (req, res) => {
    res.sendFile(path.resolve(__dirname, 'dist', 'index.html'));
});

关于node.js - Node 和reactjs axios服务器请求返回index.html文件而不是json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47637435/

相关文章:

node.js - 如何仅安装 package.json 文件中定义的那些包

javascript - 在 nodejs 中发送多部分/表单数据

javascript - React Hooks 状态变量在 setTimeout 函数期间未更新

python - 合并来自两个不同数据库的表 - sqlite3/Python

node.js - 在 PassportJS 中使用多种本地策略

javascript - Canvas 重新绘制被卡住(性能问题)

css - 如何更改Ag网格边框颜色?

javascript - Router 6 - 从父组件调用子组件函数

c# - Imgur OAuth2 身份验证和上传 C#

node.js - 如何防止在 Express 的 REST api 调用中使用冲突的关键字