《4-04 第四天 上传临时素材之图片和视频》

来源:4-4 第四天 上传临时素材之图片和视频

Hero_Tan

2017-04-07

因为 bluebird + request 的新版本 

else if (content === '5') {
   var data = yield wechatApi.uploadMaterial('image', __dirname + '/2.jpg')
   console.log('datadatadata: '+data.media_id)
   reply = {
       type: 'image',
       mediaId: data.media_id
   }
}

执行5这个回复图片的时候

在 Wechat.prototype.uploadMaterial 方法里面 的request会导致流程莫名其妙的执行了三次

 request({methos: 'POST',url: url, formData:form, json: 

                true}).then(function(response){

                    var _data = response[1]

 

                    if(_data){

                        resolve(_data)

                        console.log(_data)

                    }

                    else{

                        throw new Error('Upload material fails')

                    }

                })

http://szimg.mukewang.com/58e6767d0001534012800962.jpg

现在还没有找到解决办法。。。看看大家有没有遇到

写回答

6回答

Scott

2017-04-07

request({methos: 'POST'


应该是 request({method: 'POST'


有很少人遇到了这个问题,其中有一个学生是家里的宽带运营商导致有问题,换了手机 4G 热点就好了,还有的学生测试号异常,必须是很小很小的图片才行

0
2
Hero_Tan
谢谢老师!
2017-04-13
共2条回复

Scott

2017-04-10

koa 用 1.2.0 的版本


同时 request 用最新的版本,参考 request 的最新 API,获取 data 是通过 response.body 而不是 课程中老的 response[1]


再试试看

0
4
Scott
回复
Hero_Tan
恩,实在不好意思,耽误你这么久,我把这个问题收藏起来吧,凭记性是不行了,以后其他同学遇到,分享给他们
2017-04-13
共4条回复

Scott

2017-04-08

是奇怪,request(options) 这里,也会执行三次么,还是说,拿到 _data 后,后面的流程又执行了 3 次。

另外,request 可以安装新一点的版本了,新版本获取 _data 可以通过 response.body 直接获取

0
1
Hero_Tan
谢谢老师一直的关注,现在能确定一些眉目了,请看下我的回复。
2017-04-10
共1条回复

子佳麦兜

2017-05-10

遇到同样的问题,不知道楼主有解了没有~~~

0
0

Hero_Tan

提问者

2017-04-10

谢谢老师一直的关注,现在能确定一些眉目了。

var Promise = require('bluebird')

var request = Promise.promisify(require('request'))


                          request(options).then(function (data) { 

                             console.log('success') //连带整一个程序执行过程都执行了三次,打印了三次success,


                })


                that.fetchAccessToken().then(function (data) {

                          console.log('success')  //打印一次success

                })

上面的两部分代码按理论都是打印'success'的,可结果不是!

因为fetchAccessToken返回的是 Promise 是 return Promise.resolve(data)

而request(options) 返回的也是Promise


明显两个Promise的执行结果很不一样。


现在比较确定是版本问题

var Promise = require('bluebird')

var request = Promise.promisify(require('request'))


我的nodejs是

node -v

v6.9.5


我的package

  "dependencies": {

    "bluebird": "^3.5.0",

    "ejs": "^2.5.6",

    "heredoc": "^1.3.1",

    "koa": "^2.2.0",

    "lodash": "^4.17.4",

    "raw-body": "^2.2.0",

    "request": "^2.81.0",

    "request-promise": "^4.2.0",

    "sha1": "^1.1.1",

    "xml2js": "^0.4.17"

  },


但是我的blue 和request 都尝试过用你的package.json里面的版本,也是不行

所以我怀疑是不是nodejs版本或者koa版本的问题!


0
0

Hero_Tan

提问者

2017-04-08

//szimg.mukewang.com/58e7cf7b0001f4ad04790431.jpg

//szimg.mukewang.com/58e7d08b00016ad707290893.jpg

//szimg.mukewang.com/58e7cf7d0001ade606920171.jpg

//szimg.mukewang.com/58e7cf7e000108f205920768.jpg

这是代码的执行顺序,我找了两天,真的不知道问题出现在哪里。无语。。。


0
0

7天搞定Node.js微信公众号

Koa框架、ES2015新特性、MongoDB,开发微信公众号

1742 学习 · 787 问题

查看课程