Получите TypeError при попытке загрузить изображение в Cloudinary - PullRequest
0 голосов
/ 30 мая 2019

Я пытался загрузить изображение прямо из моей формы в облачный. Всякий раз, когда я пытаюсь загрузить изображение, я получаю следующее сообщение об ошибке:

/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.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 });

Маршрут My Post:

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);
    });
});

Я полностью озадачен, пытаясь устранить эту ошибку, любые советы о том, где я иду не так, будут с благодарностью.

1 Ответ

0 голосов
/ 31 мая 2019

Я думаю, что вы пропустили небольшую ошибку - вы уже перешли в объект v2 SDK, когда вам это требуется здесь:

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);
});

Некоторые ссылки, которые я нашел полезными:

...