react-ssr之node代理

本文介绍如何在前后端分离的项目中,利用httpProxy进行服务器代理配置,避免跨域问题。通过在src/server/index.js中配置代理,以及在src/client/和src/server/下分别设置axios的request对象,实现不同环境下的请求适配。同时,通过redux-thunk的withExtraArgument传递不同的请求对象到actions中,完成数据请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

src/server/index.js 中配置代理

主要借用 httpProxy 插件实现

const Koa = require('koa2')
const _ = require('koa-route');
const httpProxy = require('http-proxy-middleware');
import render from './render'
const k2c = require('koa2-connect');
const port = 4000
let app = new Koa()

// 代理插件配置
app.use(async (ctx, next) => {
    if (ctx.url.startsWith('/api')) {
        await k2c(httpProxy({
        target: 'http://127.0.0.1:4001', 
        changeOrigin: true,
        secure: false,
        }
        ))(ctx,next);
    }
    await next()
});

// 设置服务端静态目录
app.use(require('koa-static')('public'))
// 这里路径改为*, 不管哪个路径,都组走这里
app.use(_.get('*', render))

app.listen(port, () => {
    console.log(`server start at ${port}`)
})

配置axios basepath

配置好以后我们就不用再添加host了,走默认配置

  • 在src/client/下新建request.js,内容如下
import axios from 'axios'
// 创建一个axios的实例, 配置baseURL的基准路径
export default axios.create({
  baseURL: '/'
})

src/server/request.js 新建文件

这里是服务端的请求配置

import axios from 'axios'
// 创建一个axios的实例, 配置baseURL的基准路径
// 服务器端访问的时候访问4001
export default (ctx) => axios.create({
  baseURL: 'http://localhost:4001',
  headers: {
    cookie: ctx.req.headers.cookie || '' // 从请求中拿到cookie
  }
})

src/client/request.js 新建文件

这里是客户端的请求配置

import axios from 'axios'
// 创建一个axios的实例, 配置baseURL的基准路径
export default axios.create({
  baseURL: '/'
})

修改src/store/index.js, 给redux参数

使用 withExtraArgument 给think传递额外的参数
服务端和客户端传入不同的请求对象

import { createStore, applyMiddleware } from 'redux'
// import saga from 'redux-saga'
import logger from 'redux-logger'
import thunk from 'redux-thunk'
import reducers from './reducers'
import clientRequest from '../client/request'
import serverRequest from '../server/request'

// withExtraArgument 给redux-thunk传递自定义参数
export function getServerStore () {
    return createStore(
        reducers,
        applyMiddleware(thunk.withExtraArgument(serverRequest), logger)
    )
}

export function getClientStore () {
    let initState = window.content.state
    return createStore(
        reducers,
        initState,
        applyMiddleware(thunk.withExtraArgument(clientRequest), logger)
    )
}

actions的修改

这里不在使用import引入的axios请求数据,而换成我们传递过来的request对象

import * as types from '../action-types' 

export default {
    login ({user}) {
        return function (dispatch, getState, request) {
            return request.post('/api/login', {
                data: user
            }).then(res=>{
            let {data} = res
            dispatch({
                type: types.SET_SESSION,
                payload: data.data
            }) 
        })
        }
    },
    logout () {
        return function (dispatch, getState, request) {
            return request.get('/api/logout').then(res=>{
            let {data} = res
            dispatch({
                type: types.SET_SESSION,
                payload: data.data
            }) 
        })
        }
    },
    getUser () {
        return function (dispatch, getState, request) {
            return request.get('/api/user').then(res=>{
                let {data} = res
                dispatch({
                    type: types.SET_SESSION,
                    payload: data.data
                }) 
            })
        }
    }
}

总结

实现步骤如下:

  • 使用httpProxy进行服务器的代理配置
  • 修改服务端和客户端的request对象,设置basePath
  • 将不同的请求对象传递给不同redcer
  • 再actions中使用传递过来的request对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值