请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

正在回答 回答被采纳积分+3

7回答

Scott 2016-11-07 08:31:27

Promise.all({ Video.findOne({_id: videoId}).exec(), Audio.findOne(query).exec() })


all 里面应该要传一个数组而不是对象:


Promise.all([ Video.findOne({_id: videoId}).exec(), Audio.findOne(query).exec() ])

0 回复 有任何疑惑可以回复我~
Scott 2016-11-06 20:49:33
exports.video = function *(next) {
  var body = this.request.body
  var videoData = body.video
  var user = this.session.user
  if (!videoData || !videoData.key) {
    this.body = {
      success: false,
      err: '视频没有上传成功!'
    }
    return next
  }
  var video = yield Video.findOne({
    qiniu_key: videoData.key
  })
  .exec()
  if (!video) {
    video = new Video({
      author: user._id,
      qiniu_key: videoData.key,
      persistentId: videoData.persistentId
    })
    video = yield video.save()
  }
  var url = config.qiniu.video + video.qiniu_key
  robot
    .uploadToCloudinary(url)
    .then(function(data) {
      if (data && data.public_id) {
        video.public_id = data.public_id
        video.detail = data
        video.save().then(function(_video) {
          asyncMedia(_video._id)
        })
      }
    })
  this.body = {
    success: true,
    data: video._id
  }
}


这是我的代码,可以比对下。另外,里面的的 api key secret 什么的,一定换成自己的哈


在 var url = config.qiniu.video + video.qiniu_key 前面加一下 console.log(video) 看看这个 video 是什么,然后看能不能通过地址直接访问到这个 video 地址。

0 回复 有任何疑惑可以回复我~
  • 提问者 manny #1
    还有这个 Video.findOne 会报错,中间点报错,  node app  启动报错
     Promise.all({
            Video.findOne({_id: videoId}).exec(),
            Audio.findOne(query).exec()
        })
    回复 有任何疑惑可以回复我~ 2016-11-06 22:17:06
Scott 2016-10-30 13:12:37

应该是请求挂了吧,对请求里面的 err 打印一下看看,看看请求挂的原因是什么,这个 rejection 貌似是没有捕获这个错误导致

0 回复 有任何疑惑可以回复我~
  • 提问者 manny #1
    异步上传到cloudinary 地址怎么是七牛的
    回复 有任何疑惑可以回复我~ 2016-10-30 19:10:36
  • 您好,音频上传到cloudinary的时候出错,xhr.onerror = 0, 经过多次测试,发现是表单拼接file的时候,错误代码才为0,在console中,表单每一条都是有值的。求助啊
                        body.append('file', {
                            type: 'video/mp4',
                            uri: this.state.audioPath,
                            name: key
                        })
    回复 有任何疑惑可以回复我~ 2017-04-26 11:18:11
  • Scott 回复 慕粉3316582 #3
    是从 app 里面前端直接上传到 cloudinary 对吧,要不这样吧,先往后面跟代码,这里跳过一下,因为后面就把这块逻辑改掉了,改成了 audio 和 video 都往七牛上传,之后是在服务器端,对七牛的音视频和 cloudinary 这里做了一个同步,这种方案更简单一些。
    
    cloudinary 的缺点是上传会不稳定,且比较慢,容易超时,最终还是要用七牛
    回复 有任何疑惑可以回复我~ 2017-04-27 07:43:23
提问者 manny 2016-11-06 22:15:32
console.log(video) 
    var url = config.qiniu.video + video.qiniu_key
    
    robot
        .uploadToCloudinary(url)
        .then(function(data){
            if(data && data.public_id){
                video.public_id = data.public_id
                video.detail = data

                video.save().then(function(_video){
                    asyncMedia(_video._id )
                })
            }
        })
        .catch((err) => {
            console.log(err)
        })

    this.body = {
        success: true,
        data: video._id
    }

api key secret 我检查了是我自己账号的


打印了video

zhoujialindembp:imoocServer shadow$ node app
Listening: 1234
  <-- POST /api/signature
  --> POST /api/signature 200 62ms 319b
  <-- POST /api/creations/video
{ __v: 0,
  author: 580383804be040367c11643e,
  qiniu_key: '243974bb-766a-47c2-a407-df83c4adae64.mp4',
  persistentId: 'z0.581f39df45a2655db7826c40',
  _id: 581f39df4226b5dc59e94efb,
  meta: 
   { updateAt: Sun Nov 06 2016 22:10:39 GMT+0800 (CST),
     createAt: Sun Nov 06 2016 22:10:39 GMT+0800 (CST) } }
  --> POST /api/creations/video 200 105ms 50b
{ error: 
   { [Error: ENOENT: no such file or directory, open 'ofuein66v.bkt.clouddn.com243974bb-766a-47c2-a407-df83c4adae64.mp4']
     errno: -2,
     code: 'ENOENT',
     syscall: 'open',
     path: 'ofuein66v.bkt.clouddn.com243974bb-766a-47c2-a407-df83c4adae64.mp4' } }


0 回复 有任何疑惑可以回复我~
提问者 manny 2016-11-06 11:46:56

robot.js文件里


cloudinary.config(config.cloudinary)


exports.uploadToCloudinary = function(url){

     return new Promise(function(resolve, reject){

     cloudinary.uploader.upload(url, function(result){

     if(result && result.public_id){

     resolve(result)

     }else{

     reject(result)

     }

     }, {

     resource_type: 'video',

     folder: 'video'  //指定上传到哪个文件夹下

     })

     })

}



0 回复 有任何疑惑可以回复我~
提问者 manny 2016-11-05 18:57:22

你代码里写也是这样地址

https://img1.sycdn.imooc.com/szimg//581dbaf40001f3dc20441894.jpg

0 回复 有任何疑惑可以回复我~
提问者 manny 2016-10-30 19:09:19

打印错误

https://img1.sycdn.imooc.com/szimg//5815d42e0001d3c514160906.jpg

下面截图这段代码,是异步将视频上传到 cloudinary 上, 为什么 url 地址拼接是是七牛的

https://img1.sycdn.imooc.com/szimg//5815d4560001d56c12841266.jpg

https://img1.sycdn.imooc.com/szimg//5815d4d3000108b319561122.jpg




0 回复 有任何疑惑可以回复我~
  • Scott #1
    你的 url 地址拼接的是七牛啊,所以 uploadToCloudinary 就把资源推送到七牛了,把这个 url 改成对应的 cloudinary 就行了吧
    回复 有任何疑惑可以回复我~ 2016-10-30 22:47:57
  • 提问者 manny 回复 Scott #2
    红圈里的是你写代码,我仔细比对了检查了下,我代码写的跟你一样
    回复 有任何疑惑可以回复我~ 2016-11-05 18:56:43
  • Scott 回复 提问者 manny #3
    恩,把这个改一下,看看能不能跑通
    回复 有任何疑惑可以回复我~ 2016-11-05 20:23:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信