【问题标题】:cloudinary error: must supply api-key - /node_modules/cloudinary/lib/utils.js:982cloudinary 错误:必须提供 api-key - /node_modules/cloudinary/lib/utils.js:982
【发布时间】:2018-06-06 18:47:01
【问题描述】:

我正在使用 cloudinary 在我的网页上上传照片。 我在网页中添加了一个新功能(facebook 登录),现在当我尝试像以前一样上传照片时,cloudinary 会抛出错误。

"/home/ubuntu/workspace/YelpCamp/node_modules/cloudinary/lib/utils.js:982 throw "必须提供 api_key"; ^ 必须提供 api_key"

API_KEY、API_SECRET 和 CLOUD_NAME 保存在 .env 文件中,这些都是正确的。

var express = require("express");
var router  = express.Router();
var Campground = require("../models/campground");
var middleware = require('../middleware') ;          //because of the index.js default name
var geocoder = require('geocoder');

///////////////////////////////////////
// MULTER

var multer = require('multer');
var storage = multer.diskStorage({
  filename: function(req, file, callback) {
    callback(null, Date.now() + file.originalname);
  }
});
var imageFilter = function (req, file, cb) {
    // accept image files only
    if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/i)) {
        return cb(new Error('Only image files are allowed!'), false);
    }
    cb(null, true);
};
var upload = multer({ storage: storage, fileFilter: imageFilter});

///////////////////////////////////////
//CLOUDINARY

var cloudinary = require('cloudinary');
cloudinary.config({ 
  cloud_name: process.env.CLOUD_NAME, 
  api_key: process.env.CLOUD_KEY,
  api_secret: process.env.CLOUD_SECRET
});





router.post('/', middleware.isLoggedIn, upload.single('image'), function(req, res) {
    console.log(req.user);
    //GEOCODER
    geocoder.geocode(req.body.location, function (err, data) {              
        
    //CLOUDINARY UPLOAD   
         cloudinary.uploader.upload(req.file.path, function(result) {           
                 var image = {
                     path: result.secure_url,
                     id: result.public_id
                 };
                 
                 
                 var name = req.body.name;
                 var price = req.body.price;
                 var description = req.body.description;
                 if(req.user.facebook.username) {
                     var username = req.user.facebook.username;
                 } else {
                     username = req.user.local.username;
                 }
                 var author = {
                    id: req.user._id,
                    username: username
                };
               if(!data.results[0]) {
                    var lat = 90;
                    var lng = 0;
                    var location = "North Pole";
                   
               } else {
                 lat = data.results[0].geometry.location.lat;
                 lng = data.results[0].geometry.location.lng;
                 location = data.results[0].formatted_address;
               }
                
                var newCampground = {name: name, price: price, image: image, description: description, author: author, location: location, lat: lat, lng: lng};
          //create      
            Campground.create(newCampground, function(err, result) {
             if(err) {
                 console.log(err);
             } else {
                 console.log(result);
                 res.redirect('/campgrounds');
             }
             
            });  
        });
    });
});
<% include ../partials/header %>







    <div class="row">
        <h1 style="text-align: center;">Create a New CampGround</h1>
        <div style='width: 30%; margin: 30px auto;'>
            <form action='/campgrounds' method='POST' enctype="multipart/form-data">
                <div class='form-group'>
                    <label for="name">Name</label>
                    <input class="form-control" id="name" type='text' name='name' placeholder='Name'>
                </div>
                 <div class='form-group'>
                     <label for="price">Price</label>
                    <input class="form-control" id="price" type='number' name='price' placeholder='price' min="0.01" step="0.01">
                </div>
                <div class='form-group'>
                    <label for="image">Image</label>
                    <input type="file" id="image" name="image" accept="image/*" required>
                </div>
                <div class='form-group'>
                    <label for="description">Description</label>
                    <input class="form-control" id="description" type='text' name='description' placeholder='Write description'>
                </div>
                <div class="form-group">
                    <label for="location">Location</label>
                    <input class="form-control" type="text" name="location" id="location" placeholder="Yosemite National Park, CA">
                </div>
                <div class='form-group'>
                    <button class="btn btn-lg btn-default btn-primary btn-block">Submit!</button>
                </div>
            </form>
            <a href="/campgrounds"> Go Back </a>
        </div>
        
    </div>






<% include ../partials/footer %>

【问题讨论】:

  • API_KEY、API_SECRET 和 CLOUD_NAME 保存在 .env 文件中”您的意思是 CLOUD_KEYCLOUD_SECRET 还是打错字?
  • 是的,对不起,我的意思是 CLOUD_KEY & CLOUD_SECRET 和 CLOUD_NAME 保存在 .env 文件中。

标签: javascript node.js cloudinary


【解决方案1】:

cloudinary 配置值必须在字符串中,否则它们将不起作用。 在您的云端部分中配置您的代码:

1a:CloudinaryConfig.js:

cloudinary.config({ 
    cloud_name: process.env.CLOUD_NAME, 
    api_key: process.env.CLOUD_KEY,
    api_secret: process.env.CLOUD_SECRET
});

1b:.env

   CLOUDINARY_CLOUD_NAME='sample'
   CLOUDINARY_API_KEY='874837483274837'
   CLOUDINARY_API_SECRET='a676b67565c6767a6767d6767f676fe1'

2:将您的云提供的值直接放入代码中:

   cloudinary.config({ 
       cloud_name: 'sample', 
       api_key: '874837483274837',
       api_secret: 'a676b67565c6767a6767d6767f676fe1'
   });

注意:出于安全原因,请确保您不公开配置值。如果您将代码提交到 github 之类的公共存储库,请使用 .gitignore 忽略存储秘密信息的任何文件。

查看 cloudinary 文档以获取更多参考:https://cloudinary.com/documentation/node_integration

【讨论】:

    【解决方案2】:

    原因可能是您的 js 文件中没有包含 require('dotenv').config(); 尝试添加它,然后运行您的代码。

    【讨论】:

      【解决方案3】:

      您能否尝试将 API 密钥直接放入您的代码中,看看是否可行。您还可以添加打印语句并查看 API 密钥得到的响应

      【讨论】:

      • 我将 API_Key 登录到控制台,它是正确的。当我直接把它放在代码中时,它甚至没有工作。
      【解决方案4】:

      dotenv 必须在您使用 process.env.API_KEY 的顶部:

      require("dotenv").config();
      

      【讨论】:

      • 嗨!您可以在编写答案时格式化您的代码吗?我会让大家更容易阅读!
      【解决方案5】:

      使用这个

      const dotenv = require('dotenv'); dotenv.config();

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      猜你喜欢
      • 2021-05-22
      • 2014-09-25
      • 1970-01-01
      • 2015-08-20
      • 2020-02-21
      • 2016-10-30
      • 1970-01-01
      • 2020-11-05
      • 2020-01-14
      相关资源
      最近更新 更多