2016-12-04 85 views
1

我正在制作一个接受视频并将其上传到cloudinary的API。然后将有关上传的元数据返回给用户。当我尝试处理中间件中的视频时,出现了我遇到的问题。我不知道为什么我不断收到此错误。快递中间件错误

错误:

/Users/name/test/cloudinary_upload/node_modules/express/lib/router/route.js:196 
     throw new Error(msg); 
     ^

Error: Route.post() requires callback functions but got a [object Object] 
    at Route.(anonymous function) [as post] (/Users/name/test/cloudinary_upload/node_modules/express/lib/router/route.js:196:15) 
    at Function.proto.(anonymous function) [as post] (/Users/name/test/cloudinary_upload/node_modules/express/lib/router/index.js:510:19) 
    at Object.<anonymous> (/Users/name/test/cloudinary_upload/routes.js:8:8) 
    at Module._compile (module.js:541:32) 
    at Object.Module._extensions..js (module.js:550:10) 
    at Module.load (module.js:458:32) 
    at tryModuleLoad (module.js:417:12) 
    at Function.Module._load (module.js:409:3) 
    at Module.require (module.js:468:17) 
    at require (internal/module.js:20:19) 

PROJECT CODE BELOW:

app.js

'use strict'; 

var express = require('express'); 
var formidable = require('express-formidable'); 
var port = process.env.PORT || 3000; 
var routes = require('./routes'); 
var app = express(); 

// Parse incoming request 
app.use(formidable()); 

app.use('/routes', routes); 

// Catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// Error handler 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.json({ 
    error: { 
     message: err.message 
    } 
    }); 
}); 


app.listen(port, function() { 
    console.log('Express server is listening on port ' + port); 
}); 

routes.js

'use strict'; 

var express = require('express'); 
var createThumbnail = require('./middleware/generatevideothumbnail'); 
var uploadToCloudinary = require('./middleware/uploadtocloudinary'); 
var router = express.Router(); 

router.post('/upload', uploadToCloudinary, createThumbnail, function(req, res, next) { 
    console.log(req.cloudinaryObject); 
    console.log(req.videoThumbnail); 
    res.json(req.cloudinaryObject); 
}); 

module.exports = router; 

uploadtocloudinary.js

'use strict'; 

var cloudinary = require('../cloudinary_config.js').cloudinary; 

/************************************************************ 
MIDDLEWARE: Accepts the request object. Uploads the video 
file to cloudinary. Passes the video's public id, version, file 
type, time of upload, file size and url to the next middleware 
on the request object. 
************************************************************/ 
function uploadToCloudinary(req, res, next) { 
    cloudinary.uploader.upload(req.files.fileToUpload.path, function(resultOfUpload) { 
    var cloudinaryObject = { 
     public_id: resultOfUpload.public_id, 
     version: resultOfUpload.version, 
     typeOfFile: resultOfUpload.format, // Type of file 
     uploadTime: resultOfUpload.created_at, // Upload time 
     fileSize: resultOfUpload.bytes, // File size 
     videoUrl: resultOfUpload.secure_url // Video URL 
    } 

    req.cloudinaryObject = cloudinaryObject; 

    next(); 
    }, { 
    resource_type: "video" 
    }); 
} 

module.exports.uploadToCloudinary = uploadToCloudinary; 

generatevideothumbnail.js

'use strict'; 

/************************************************************ 
MIDDLEWARE: Accepts the request object. Use the version and 
public id of video to create thumbnail url string. Pass 
thumbnail url to next middleware on the request object. 
************************************************************/ 
function generateVideoThumbnail(req, res, next) { 
    req.videoThumbnail = "https://res.cloudinary.com/xxxxxxxxx/video/upload/v" 
         + req.cloudinaryObject.version 
         + "/" 
         + req.cloudinaryObject.public_id 
         + ".jpg"; 

    next() 
} 

module.exports.generateThumbnail = generateVideoThumbnail; 
+0

如果您尝试'module.exports ='而不是'module.exports.uploadToCloudinary ='和'module.exports.generateThumbnail =',会发生什么? – fredrover

+0

谢谢你解决了这个问题!但为什么? – TheNewGuy

+0

我会发布一个答案并解释它 – fredrover

回答

0

还有的当您使用module.exports如何处理您所需的文件发送几个不同的选择。您可以发送整个对象,也可以发送特定的功能。

使用module.exports.uploadToCloudinary=module.exports.generateThumbnail=您发送的对象包含功能uploadToCloudinarygenerateThumbnail。当您使用,需要它例如,

var createThumbnail = require('./middleware/generatevideothumbnail'); 

您可以使用该功能generateThumbnail要导出的对象。换句话说,访问你想要的功能,你必须写:

createThumbnail.generateThumbnail 

如果你只是希望能够当你在需要的文件带来的只使用一个特定的功能,只是有的名称该功能module.exports,像这样的:

module.exports = generateVideoThumbnail; 

参考:https://www.sitepoint.com/understanding-module-exports-exports-node-js/https://nodejs.org/api/modules.html

让我知道,如果这是有道理的。

+0

是的,这非常有帮助。谢谢 – TheNewGuy