【问题标题】:Error EACCES permission denied mkdir multer node.js错误 EACCES 权限被拒绝 mkdir multer node.js
【发布时间】:2016-05-14 11:13:07
【问题描述】:

我有一个运行在 Ubuntu 14.04 LTS 机器上的 Node.js 应用服务器,但是当我尝试通过浏览器连接时,PM2 日志中显示以下错误:

www-0 (err): Error: EACCES: permission denied, mkdir '/var/www/myapp/MyApp/MyApp/uploads'
www-0 (err):     at Error (native)
www-0 (err):     at Object.fs.mkdirSync (fs.js:794:18)
www-0 (err):     at Function.sync (/var/www/myapp/MyApp/MyApp/node_modules/multer/node_modules/mkdirp/index.js:71:13)
www-0 (err):     at new DiskStorage (/var/www/myapp/MyApp/MyApp/node_modules/multer/storage/disk.js:21:12)
www-0 (err):     at module.exports (/var/www/myapp/MyApp/MyApp/node_modules/multer/storage/disk.js:65:10)
www-0 (err):     at new Multer (/var/www/myapp/MyApp/MyApp/node_modules/multer/index.js:15:20)
www-0 (err):     at multer (/var/www/myapp/MyApp/MyApp/node_modules/multer/index.js:88:12)
www-0 (err):     at Object.<anonymous> (/var/www/myapp/MyApp/MyApp/app.js:45:9)
www-0 (err):     at Module._compile (module.js:410:26)
www-0 (err):     at Object.Module._extensions..js (module.js:417:10)
www-0 (err):     at Module.load (module.js:344:32)
www-0 (err):     at Function.Module._load (module.js:301:12)
www-0 (err):     at Function._load (/usr/local/lib/node_modules/pm2/node_modules/pmx/lib/transaction.js:62:21)
www-0 (err):     at Module.require (module.js:354:17)
www-0 (err):     at require (internal/module.js:12:17)
www-0 (err):     at Object.<anonymous> (/var/www/myapp/MyApp/MyApp/bin/www:7:11)

如您所见,错误来自 multer 包。我目前使用的是 multer 1.1.0 版,这是我的app.js 文件:

// app.js

// set up ======================================================================
// get all the tools we need

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var session = require('express-session');
var mongoose = require('mongoose');
var passport = require('passport');
var flash = require('connect-flash');
var multer = require('multer');

var configDB = require('./config/database');

var app = express();

// configuration ===============================================================
mongoose.connect(configDB.url); // connect to our database
require('./config/passport')(passport); // pass passport for configuration

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
//app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({
    secret: 'secret',
    resave: false,
    saveUninitialized: false
})); // session secret
app.use(passport.initialize());
app.use(passport.session()); // persistent login session
app.use(flash()); // use connect-flash for flash messages stored in session
app.use(multer({ // use multer for processing of multipart/form-data
    dest: 'uploads/',
    rename: function (fieldname, filename){
        return filename.replace(/\W+/g, '-').toLowerCase() + Date.now();
    },
    onFileUploadStart: function (file){
        console.log(file.fieldname + ' upload starting...');
    },
    onFileUploadData: function (file, data){
        console.log(data.length + ' of ' + file.fieldname + ' arrived');
    },
    onFileUploadComplete: function (file){
        console.log(file.fieldname + ' uploaded to ' + file.path);
    }
}).single('avatar'));

// routes ======================================================================
require('./routes/routes')(app, passport); // load our routes and pass in our app and fully configured passport

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// set production environment
app.set('env', 'production');

// set development environment
//app.set('env', 'development');

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('pages/error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('pages/error', {
    message: err.message,
    error: {}
  });
});


module.exports = app;

还有,这些是目录当前拥有的权限和权限(myuser有sudo权限)

myuser@myhost:~$ ls -dl /var/www
drwxr-xr-x 3 root root 4096 Feb  4 01:17 /var/www

myuser@myhost:~$ ls -dl /var/www/myapp
drwxr-xr-x 3 myuser myuser 4096 Feb  4 01:18 /var/www/myapp

myuser@myhost:~$ ls -dl /var/www/myapp/MyApp
drwxrwxr-x 4 myuser myuser 4096 Feb  4 16:49 /var/www/myapp/MyApp

myuser@myhost:~$ ls -dl /var/www/myapp/MyApp/MyApp
drwxrwxr-x 12 myuser myuser 4096 Feb  4 16:57 /var/www/myapp/MyApp/MyApp

myuser@myhost:~$ ls -dl /var/www/myapp/MyApp/MyApp/uploads
drwxrwxr-x 2 myuser myuser 4096 Feb  4 02:04 /var/www/myapp/MyApp/MyApp/uploads

顺便说一句,更改为{ dest: './uploads/'} 会出现同样的错误。

【问题讨论】:

  • myuser 可能具有 sudo 权限,但如果不使用 sudomkdir,您将获得拒绝访问。而且我希望您的应用程序不以 root 权限运行,这是安全噩梦的秘诀。
  • @migg 如何让应用程序使用 sudo 到 mkdir?通过命令行尝试时我没有任何问题,是应用程序遇到了麻烦。另外,我确信我的应用程序没有以 root 权限运行。
  • 从安全的角度来看,我认为即使有可能,您也不应该这样做。您正在使用的模块不这样做。只需将uploads 文件夹的权限更改为对运行应用程序的用户可写。
  • @migg 如果你可以看到,最后一行显示 myuser 确实对 uploads 文件夹具有写入权限,并且应用程序正在 myuser 上运行。这就是为什么我不知道发生了什么。
  • 那么上传文件夹是否已经存在,您正在尝试mkdir

标签: javascript node.js mkdir multer


【解决方案1】:

如果您使用任何 IDE 开发应用程序,请始终以 sudo 模式运行该应用程序。 例如。如果您使用的是 webstorm,那么请始终在文件中运行它的 webstorm.sh,如下所示。

sudo bash /opt/webstorm/bin/webstorm.sh

【讨论】:

  • 不确定这是一个合适的答案,最好将其发布为评论或类似内容。如果您认为这是一个答案,请详细说明这如何解决 OP 的问题
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-01
  • 2022-07-12
  • 2014-01-24
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多