sorrycc/roadhog

类似 dora-plugin-proxy 的 mock 方案,但不包含代理

sorrycc opened this issue · 24 comments

记录下方案。

配置形式

.roadhogrc.server.js 里写。第一版仅支持配置式,函数式太灵活,要考虑的点太多了。

配置式

export default {
  'GET /local': './local.js',
};

函数式

export default function(router) {
  router.get('/local', (req, res) => res.send('hello dva'));
}

装载路由配置

配置式

读取 .roadhog.server.js,拿到列表,装载给 app

函数式

通过 express.Router 支持。

const router = express.Router();
router.get();
app.use('/api', router);

热更新

参考 express-remove-route ,检测到文件文件更新时,通过 app._router.stack 把上一次注册的 route 全部删除。

如何判断哪些文件做更新检测?这是 dora-plugin-proxy 所不智能的地方,可以通过在 require .roadhogrc.server.js 之前对 require 做 mockey patch,记录所有的 require,require 完之后取消 monkey patch 来获取。

本地新建.roadhogrc.mock.js,里面编写
export default {
'POST /api/results': {
data: [...],
page: {...},
success: true,
}
}
调用接口 /results时,访问不到怎么回事?

你定义了 /api/results,为何要访问 /results

之前的mock方案是自动添加/api的,现在我两个接口 '/api/results'和‘/results’都尝试了,还是报404错误

其他地方需要改动什么吗?比如引入文件,修改配置什么的?

roadhog 是 0.5.0 版本?

然后你访问的是 POST 接口?

npm 安装最新的是0.4.3 版本0.5.0的下载npm install 不了

抱歉,忘记 npm publish 了。。重新安装试试。

OK,可以了,太棒了!又可以在没有后端的情况下好好玩耍了。

这是我的配置文件:

export default {
'GET /employees' (req, res) {
employeeList(req, res);
},

'POST /employees' (req, res) {
	addEmployee(req, res);
}

}

看上去 GET 的时候 req.query 是没问题的,但 POST 的时候 req.body 就没有了,是不是还不支持 POST?

body 漏加了,在 #86 跟进。

mark

@sorrycc @FEliuyg 用mock的时候 .roadhogrc中的proxy应该怎么配置啊

不冲突,先走 .roadhogrc 的 proxy,再走 mock 的。

@jindada proxy可以不用配置,值为null。本地增加一个.roadhogrc.mock.js, mock接口数据在里面配置就可以了

你是怎么配置的?我的也不起效果

如果在roadhogrc里面配置了proxy,怎么进行mock?

// roadhogrc
  "proxy": {
    "/api": {
      "target": "http://localhost:61814",
      "changeOrigin": true
    }
  },
// roadhog.mock.js
`    "/api/test": { success: true, result: [{test: 'yoo'}] }`

请求时出现504错误
POST http://localhost:8000/api/test 504 (Gateway Timeout)

在server命令行窗口看到错误信息:
[HPM] Error occurred while trying to proxy request /api/test from localhost:8000 to http://localhost:61814 (ECONNREFUSED) (https://nodejs.org/api/errors.html#errors_common_system_errors)

查了下这是由于服务器拒绝,那我想是不是防火墙的问题,然后试着设置了下端口规则,不知道有没有设置对,但还是一样的结果。所以。。。这到底是要怎么弄。。

@DrakeXiang 都 proxy 到另一个服务器了,再配 mock 规则肯定无效了吧。

@sorrycc 额,我是小白,之前以为把61814这个端口打开就可以了,周末折腾了一下,最后还是把proxy去掉了