公众号暂时无法提供服务,mediaId:undefined
来源:4-4 第四天 上传临时素材之图片和视频
			dravenxiaokai
2017-03-26
//weixin.js
'use strict'
var config = require('./config')
var Wechat = require('./wechat/wechat')
var wechatApi = new Wechat(config.wechat)
exports.reply = function* (next){
	var message = this.weixin
	if(message.MsgType === 'event'){
		if(message.Event === 'subscribe'){
			if(message.EventKey){
				console.log('扫描二维码进来:'+message.EventKey+' '+message.Ticket)
			}
			this.body = '哈哈,你订阅成功啦!\r\n欢迎来到draven_小凯的世界!\r\n输入任意数字会有意外惊喜哦~'
		}
		else if(message.Event === 'unsubscribe'){
			console.log('无情取关')
			this.body = ''
		}
		else if(message.Event === 'LOCATION'){
			this.body = '您上报的位置是:'+message.Latitude+'/'+message.Longitude+'-'+message.Precision
		}
		else if(message.Event === 'CLICK'){
			this.body = '您点击了菜单:'+message.EventKey
		}
		else if(message.Event === 'SCAN'){
			console.log('关注后扫二维码'+message.EventKey+' '+message.Ticket)
			this.body = '看到你扫了一下哦'
		}
		else if(message.Event === 'VIEW'){
			this.body = '您点击了菜单中的链接:'+message.EventKey
		}
	}else if(message.MsgType === 'text'){
		var content = message.Content
		var reply = '额,你说的 '+message.Content + ' 太复杂了'
		if(content === '1'){
			reply = '天下第一吃大米'
		}else if(content === '2'){
			reply = '天下第二吃豆腐'
		}else if(content === '3'){
			reply = '天下第三吃仙丹'
		}else if(content === '4'){
			reply = [{
				title:'技术改变世界',
				description:'我只是个描述而已',
				picUrl:'http://wx3.sinaimg.cn/mw690/e41455a1gy1fe07rkyhi2j20e50800tc.jpg',
				url:'https://github.com/'
			},{
				title:'Nodejs 开发微信',
				description:'就是这个feel倍儿爽!',
				picUrl:'http://wx2.sinaimg.cn/small/e41455a1gy1fe07ptwn36j20ch0783zo.jpg',
				url:'https://nodejs.org/'
			}]
		}else if(content === '5'){
			// console.log(__dirname)
			var data = yield (wechatApi.uploadMaterial('image',__dirname+'/2.jpg'))
			reply = {
				type:'image',
				mediaId:data.mediaId
				// mediaId:data.media_id
			}
			console.log(reply)
		}
		this.body = reply
	}
	yield next
//tpl.js
'use strict'
var ejs = require('ejs')
var heredoc = require('heredoc')
var tpl = heredoc(function(){/*
	<xml>
	<ToUserName><![CDATA[<%= toUserName %>]]></ToUserName>
	<FromUserName><![CDATA[<%= fromUserName %>]]></FromUserName>
	<CreateTime><%= createTime %></CreateTime>
	<MsgType><![CDATA[<%= msgType %>]]></MsgType>
	<% if(msgType==='text'){ %>
	<Content><![CDATA[<%- content %>]]></Content>
	<% }else if(msgType ==='image'){ %>
	<Image>
	<MediaId><![CDATA[<%= content.mediaId %>]]></MediaId>
	</Image>
	<% }else if(msgType==='voice'){ %>
	<Voice>
	<MediaId><![CDATA[<%= content.mediaId %>]]></MediaId>
	</Voice>
	<% }else if(msgType==='video'){ %>
	<Video>
	<MediaId><![CDATA[<%= content.mediaId %>]]></MediaId>
	<Title><![CDATA[<%= content.title %>]]></Title>
	<Description><![CDATA[<%= content.description %>]]></Description>
	</Video>
	<% }else if(msgType==='music'){ %>
	<Music>
	<Title><![CDATA[<%= content.title %>]]></Title>
	<Description><![CDATA[<%= content.description %>]]></Description>
	<MusicUrl><![CDATA[<%= content.musicUrl %>]]></MusicUrl>
	<HQMusicUrl><![CDATA[<%= content.hqMusicUrl %>]]></HQMusicUrl>
	<ThumbMediaId><![CDATA[<%= content.thumbMediaId %>]]></ThumbMediaId>
	</Music>
	<% }else if(msgType==='news'){ %>
	<ArticleCount><%= content.length %></ArticleCount>
	<Articles>
	<% content.forEach(function(item){ %>
	<item>
	<Title><![CDATA[<%=item.title%>]]></Title> 
	<Description><![CDATA[<%=item.description%>]]></Description>
	<PicUrl><![CDATA[<%=item.picUrl%>]]></PicUrl>
	<Url><![CDATA[<%=item.url%>]]></Url>
	</item>
	<% }) %>
	</Articles>
	<% } %>
	</xml>
*/})
var compiled = ejs.compile(tpl)
exports = module.exports = {
	compiled:compiled
}
//wechat.js写回答
	2回答
- 
				
						Scott
2017-03-27
说明拿到的 data 是不正确,也就是 执行上传这个环节有问题。
先把路径修改一下: __dirname+'/2.jpg' 改成 path.join(__dirname+'/2.jpg'),然后把 uploadMaterial 里面的返回内容打印一下:
var _data = response.body
console.log(_data)
我们看看这个 data 提示的是什么
072017-04-01 - 
				
						dravenxiaokai
提问者
2017-03-26
//wechat.js 'use strict' var Promise = require('bluebird') var request = Promise.promisify(require('request')) var util = require('./util') var fs = require('fs') var tpl = require('./tpl') var prefix = 'https://api.weixin.qq.com/cgi-bin/' var api = { accessToken:prefix+'token?grant_type=client_credential', upload:prefix + 'media/upload?' } function Wechat(opts){ var that = this; this.appID = opts.appID this.appSecret = opts.appSecret this.getAccessToken = opts.getAccessToken this.saveAccessToken = opts.saveAccessToken this.fetchAccessToken() } Wechat.prototype.updateAccessToken = function(data) { var appID = this.appID var appSecret = this.appSecret var url = api.accessToken + '&appid='+appID+'&secret='+appSecret return new Promise(function(resolve,reject){ request({url:url,json:true}).then(function(response){ // var data = response[1] 这是个坑! var data = response.body var now = (new Date().getTime()) var expires_in = now + (data.expires_in - 20) * 1000 data.expires_in = expires_in resolve(data) }) }) } Wechat.prototype.uploadMaterial = function(type,filepath) { var that = this var form = { media:fs.createReadStream(filepath) } return new Promise(function(resolve,reject){ that .fetchAccessToken() .then(function(data){ var url = api.upload + 'access_token='+data.access_token+'&type='+type // console.log(url) request({method:'POST',url:url,formData:form,json:true}) .then(function(response){ // var _data = response[1] 这是个坑! var _data = response.body // console.log('hhhhhhhhhhhhhhhh'+_data.data) if(_data){ resolve(_data) }else{ throw new Error('Upload marterial fails') } }) .catch(function(err){ reject(err) }) }) }) } Wechat.prototype.fetchAccessToken = function(data){ var that = this if(this.access_token && this.expires_in){ if(this.isValidAccessToken(this)){ return Promise.resolve(this) } } this.getAccessToken() .then(function(data){ try{ // data.JSON.parse(data) data = JSON.parse(data) }catch(e){ return that.updateAccessToken(data) } if(that.isValidAccessToken(data)){//判断票据是否有效 // Promise.resolve(data) return Promise.resolve(data);//这里加return }else{ return that.updateAccessToken()//否则更新票据 } }) .then(function(data){ //存储access_token,expires_in that.access_token = data.access_token that.expires_in = data.expires_in that.saveAccessToken(data) return Promise.resolve(data) }) } Wechat.prototype.isValidAccessToken = function(data){ if(!data || !data.access_token || !data.expires_in){ return false } var access_token = data.access_token var expires_in = data.expires_in var now = (new Date().getTime()) if(now < expires_in){ return true }else{ return false } } Wechat.prototype.reply = function(){ var content = this.body var message = this.weixin var xml = util.tpl(content,message) this.status = 200 this.type = 'application/xml' this.body = xml } module.exports = Wechat00 
相似问题
				新增临时图片素材,公众号提示无法提供服务
				
			
			回答 3
				回复图片失败
				
			
			
			
			
			
		回答 2