eggjs如何封装请求方法
发布于 5 年前 作者 luckymore 6013 次浏览 来自 问答

我想这样写,可以吗?

// app/extend/helper.js
module.exports = app => {
	const ctx = app.createAnonymousContext();
	return {
		async post(url, body) {
    		await ctx.curl(url, {
			  method: 'POST',
			  data: body,
			  contentType: 'application/x-www-form-urlencoded',
			  dataType: 'json',
			  timeout: 4900,
			  timing: true,
			  headers: {
			  	custom: '111',
			  },
   		 	})
		}
	}
}

正经应该怎么写?

6 回复

并不能,上面等价于 require 了这个文件,然后获取他的属性描述符,然后赋值给 this.app.Helper.prototype。 要使用 app 得使用 loadFile. loadToApp 或者 CustomLoader 这些, 不过这样就不是挂到 helper 上了

@yviscool 其实我也不知道挂哪合适,,您觉得最佳实践该怎么写呢?

Helper 本来就是 context 级的对象了,不需要 createAnonymousContext (它会丢失上下文的用户信息)

module.exports = {
  async myPost(url, body) {
    return this.ctx.curl(url, { method: 'POST', data: body, ... });
  }
}

一般这种我会写成一个 service 而不是 helper

@atian25 大神来啦,是这样,我每次在service发请求会带一些固定的参数,每个curl写下来有点长,,,所以想封装一个统一的post方法

我的意思是你加一个 XXService,其他 Service 都调用它,或者提供一个 BaseService 基类。

如果很常用的话,直接挂到 ctx 也未尝不可。

另外,有个 config.httpclient.request 可以用来设置全局的默认配置。

@atian25 菜比明白啦哈哈哈,感谢

回到顶部