【问题标题】:My express server doesn't recognize middleware function我的快递服务器无法识别中间件功能
【发布时间】:2017-10-15 05:13:58
【问题描述】:

我正在使用 react 进行服务器端渲染,并且我在 express 中编写了简单的服务器。不幸的是,我不断收到“TypeError('app.use()需要中间件函数')”错误。这是我的 app.js 的样子:

var express = require('express');
var path = require('path');
var logger = require('morgan');
var httpProxy = require('http-proxy');
var requestHandler = require('./public/requestHandler.bundle.js');
var app = express();

const apiProxy = httpProxy.createProxyServer({
  target:'http://localhost:3001'
});

app.use('/api', function(req,res){
  apiProxy.web(req,res);
})

app.use(logger('dev'));
app.use(express.static(path.join(__dirname, 'public')));

app.set('view engine', 'ejs');
app.use(requestHandler); //<------------------


app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});


app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

这是我的 requestHandler:

import React from 'react';
import {renderToString} from 'react-dom/server';
import {StaticRouter} from 'react-router-dom';
import {Provider} from 'react-redux';
import {createStore, applyMiddleware} from 'redux';
import thunkMiddleware from 'redux-thunk';
import reducers from '../client/reducers';
import routes from '../client/components/routes';
import axios from 'axios';

function requestHandler(req, res, next) {
  axios.get('http://localhost:3001/books').then(function(response) {
    const createStoreWithMiddleware = applyMiddleware(thunkMiddleware)(createStore);
    const store = createStoreWithMiddleware(reducers, {
      "books": {
        "books": response.data
      }
    })
    const initialState = JSON.stringify(store.getState()).replace(/<\/script/g, '<\\/script').replace(/<!--/g, '<\\\!--');
    const context = {};

    const reactComponent = renderToString(
      <Provider store={store}>
        <StaticRouter location={req.url} context={context}>
          {routes}
        </StaticRouter>
      </Provider>
    );

    if (context.url) {
      redirect(context.status, context.url)
    } else {
      res.status(200).render('index', {reactComponent, initialState})
    }

  })
  .catch(function(err){
        console.log('#Initial Server-side rendering error', err);
      })
};

export default requestHandler;

然后我使用 webpack 和 babel 将其编译为 es5。为什么我的应用不将此功能视为中间件?

我尝试使用 CommonJs 导出它 - 没有效果

【问题讨论】:

    标签: javascript node.js reactjs express


    【解决方案1】:

    您的包正在导出一个 ES6 模块,但您正在使用 CommonJs 导入它。试试:

    app.use(requestHandler.default);
    

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-11-18
      • 2021-01-06
      • 1970-01-01
      • 2015-12-12
      相关资源
      最近更新 更多