javascript - Express中间件错误

标签 javascript express middleware

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

错误:

/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;

上传到cloudinary.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;

生成视频缩略图.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;

最佳答案

当您使用module.exports时,对于与所需文件一起发送的内容有几种不同的选择。您可以发送整个对象,也可以发送特定的函数。

使用 module.exports.uploadToCloudinary=module.exports.generateThumbnail=,您将发送一个包含函数 uploadToCloudinary生成缩略图。当您需要它时,例​​如,

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

请告诉我这是否有意义。

关于javascript - Express中间件错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40964916/

相关文章:

javascript - React Native 渲染多维数组

javascript - 快速路由未解析到端点

php - Node js/Express 替代 LAMP

javascript - 使用 Nuxt.js 中间件检查 firebase 中的登录用户

python - FastAPI - 如何在中间件中获取响应正文

javascript - 使用 jquery 的 data-id 属性?

javascript - jQuery Moble 如果可能的话返回一页,否则转到这里

javascript - 有没有办法减少使用 Javascript 下载资源(图像/css 和 js 文件)?

node.js - nodejs api和swift app之间的连接

reactjs - 如何在Redux Action Creator中通过多个请求获取数据,然后将收集到的数据发送到Reducer?