【问题标题】:Receive TypeError when trying to upload an image to Cloudinary尝试将图像上传到 Cloudinary 时收到 TypeError
【发布时间】:2019-10-16 03:47:35
【问题描述】:

我一直在尝试将图像直接从我的表单上传到 cloudinary。 每当我尝试上传图片时,都会收到以下错误消息:

/mnt/c/NodeApps/uploadFile/node_modules/multer-storage-cloudinary/lib/index.js:67
    var stream = _this.cloudinary.v2.uploader.upload_stream(params, cb);
                                         ^
    TypeError: Cannot read property 'uploader' of undefined
    at /mnt/c/NodeApps/uploadFile/node_modules/multer-storage-cloudinary/lib/index.js:67:42
    at end (/mnt/c/NodeApps/uploadFile/node_modules/run-parallel/index.js:18:15)
    at process._tickCallback (internal/process/next_tick.js:61:11)

我的表格:

<form action='upload' method="POST" enctype="multipart/form-data">
    <input type='text' name='caption' placeholder="Name the image">
    <input type="file" name="new_image">
    <button type='submit'>Submit</button>
</form>

来自 app.js

var multer                  = require('multer');
var cloudinary              = require('cloudinary').v2;
var cloudinaryStorage       = require('multer-storage-cloudinary');
var bodyParser              = require('body-parser');

var app = express();

app.use(express.static('public'));
app.use(bodyParser.urlencoded({extended:true}));

Cloudinary 配置:

cloudinary.config({
    cloud_name: process.env.cloud_name,
    api_key: process.env.API_KEY,
    api_secret: process.env.API_SECRET
});

var storage = cloudinaryStorage({
    cloudinary: cloudinary,
    folder: "demo",
    allowedFormats: ['jpg', 'png'],
});
var parser = multer({ storage: storage });

我的发帖路线:

app.post('/upload', parser.single('new_image'), (req, res) => {
    cloudinary.v2.uploader.upload(req.file.path, (err, result) => {
        if (err) { console.log('Error: ' + err); }
        image.url = result.secure_url;
        console.log(image.url);
    });
});

我在试图解决这个错误时完全被难住了,任何关于我哪里出错的建议都将不胜感激。

【问题讨论】:

    标签: node.js express multer cloudinary


    【解决方案1】:

    我认为您忽略了一个小错误 - 您已经在此处需要时遍历了 SDK 的 v2 对象:

    var cloudinary = require('cloudinary').v2;
    

    所以,在这段代码中:

    cloudinary.v2.uploader.upload(req.file.path, (err, result) => {
        ...
    }
    

    您实际上是在调用cloudinary.v2.v2.uploader 而不是cloudinary.v2.uploader。因此,由于cloudinary.v2.v2 未定义,因此无法在未定义上调用上传器方法的错误。在您的要求行中或从您调用上传者的位置删除.v2


    另一个问题是,根据您的代码,您似乎要重复上传图像。由于您已将 multer 配置为使用 Cloudinary 作为存储目标,因此将其作为中间件应该意味着它会自行上传到 Cloudinary,因此当您调用 .uploader.upload() 时,这实际上是第二次上传。我相信这将是更正确的代码:

    app.post('/upload', parser.single('new_image'), (req, res) => {
        // Since multer is the middleware & set to single, req.file should be an object with the results from cloudinary
        let image = {};
        image.url = req.file.secure_url;
        console.log(image.url);
    });
    

    一些我觉得很有帮助的参考资料:

    【讨论】:

      猜你喜欢
      • 2021-03-20
      • 2016-06-29
      • 2015-02-21
      • 2017-07-12
      • 2014-11-25
      • 2021-12-02
      • 2018-03-15
      • 2017-12-01
      • 2015-11-01
      相关资源
      最近更新 更多