xiongwilee / Gracejs

A Nodejs BFF framework, build with koa2(基于koa2的标准前后端分离框架)
https://grace.wilee.me
MIT License
1.39k stars 238 forks source link

控制台怎么能打印出来,我当前浏览器请求的地址呢? #15

Closed nxycdl closed 8 years ago

nxycdl commented 8 years ago

每次有人请求一次,就打印一下他请求的地址.

xiongwilee commented 8 years ago

this.request.href

nxycdl commented 8 years ago

thanks 另外我还有个问题.我看了proxy 使用get的时候没有问题.怎么使用post呢. 以前使用的 co-request var params ={ username: username, userpassword: userpassword.toString().toUpperCase() } var result = yield request({ uri: uri, method: 'POST', form:params });

换成 proxy 这个params 的参数怎么传呢?

demo7:function*(){ //Post请求;用Form方式提交; var params ={ username: 'username', userpassword: 'passwor'.toString().toUpperCase() } yield this.proxy({ otherInfo:'htgl:post:htgl/app/logininclassapp.do', }); this.body = this.backData.otherInfo ; }

xiongwilee commented 8 years ago

好问题!关于proxy,有这样几种场景:

  1. ajax -get-> nodejs -get-> 后端
  2. ajax -get-> nodejs -post-> 后端
  3. ajax -post-> nodejs -post-> 后端
  4. ajax -post-> nodejs -get-> 后端

现在的proxy的机制是:

  1. 如果用户过来的请求是get,则proxy的请求默认是get (不用在proxy的时候加 ':get:')
  2. 同理,如果用户过来的请求是post, 则proxy的请求默认是post , (不用在proxy的时候加 ':post:')
  3. this.proxy在发送请求之前会合并 this.querythis.request.body的参数(也就是get和post的参数)然后分别交给后端

\ 基于proxy机制的第3点,如果你想要在proxy之前发送post参数,你可以在proxy之前:修改this.request.body 即可 ; 例如:**

exports.test = function*(){
  this.request.body = this.request.body || {};
  this.request.body.username = username;
  this.request.body.userpassword = userpassword.toString().toUpperCase();

  yield this.proxy({
     otherInfo:'htgl:post:htgl/app/logininclassapp.do',
  })

  this.body = this.backData.otherInfo
}

或者可以简化地写成这样(如果this.proxy方法的形参是一个字符串的话,this.proxy方法会自动把请求结果赋值给this.body):

exports.test = function*(){
  this.request.body = this.request.body || {};
  Object.assign(this.request.body, {
    username: username,
    userpassword: userpassword.toString().toUpperCase()
  })

  yield this.proxy('htgl:post:htgl/app/logininclassapp.do')
}
nxycdl commented 8 years ago

您对koa request 的知识太丰富了. 我用以上代码测试了一下发现有点问题,实在找不到原因,还请帮我看下. 测试代码 exports.test = function*(){ this.request.body = this.request.body || {}; this.request.body.username = 'username'; this.request.body.userpassword = 'userpassword';

yield this.proxy({
    otherInfo:'htgl:post:htgl/app/logininclassapp.do',
})

this.body = this.backData.otherInfo

} 但是koa-grace 提示我以下错误: koa-grace:proxy proxying : http://www.*******.com:8888/htgl/app/logininclassapp.do +11ms koa-grace-error:proxy proxy error : http://www.*******.com:8888/htgl/app/logininclassapp.do +23ms { [Error: write after end] status: 'NULL', duration: '22ms' }

xiongwilee commented 8 years ago

刚刚看了下, 果然这里是个BUG。

不过现在已经修复发布了,你升级下koa-grace(koa-grace-proxy的修复版本:1.0.40)即可。

另外,修复版本里我加了一个功能,proxy的时候你可以这么写了:

yield this.proxy({
    otherInfo:'htgl:post:htgl/app/logininclassapp.do'
},{
   form: {
     username:'username',
     userpassword:'userpassword'
   }
})

当然,之前修改this.request.body的方式也是可以的,如果两者同时存在的话,会默认优先取:form参数

nxycdl commented 8 years ago

测试通过。你太牛了。多谢帮助。