2016-12-04 8 views
1

Я создаю 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) 

КОД ПРОЕКТА НИЖЕ:

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= Вы отправляете объект, который включает функции uploadToCloudinary и generateThumbnail. Когда вы это необходимо, например,

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

Смежные вопросы