CNode

eggjs如何封装请求方法

问答
Lluckymore发布于7 年前最后回复7 年前6 回复7209 浏览0 收藏

我想这样写,可以吗?

// 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)

Y
yviscool#2·7 年前

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

A
atian25#4·7 年前

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

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

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

L
luckymore#5·7 年前
引用 atian25Helper 本来就是 context 级的对象了,不需要 createAnonymousContext (它会丢失上下文的用户信息) 一般这种我会写成一个 service 而不是 helpe...

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

A
atian25#6·7 年前

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

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

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

参与回复
登录后即可参与回复。登录