2017-08-21 29 views
1

サーバーから画像を削除する方法を作成しようとしています。今の私はちょうどDELETE要求を処理したいとコンソールファイルパスに表示... Serverの私の要求を処理していない送信:Node.js AJAX Delete 403 Forbidden

jquery.min.js:4 DELETE http://localhost:3000/api/imagesbg/wedding-stock-2.jpg 403(禁止)

私は間違っていますか?

フロント(handlebars.js)

{{#each images}} 
    <div class="row"> 
    {{#each this}} 
     <div class="col-sm-4"> 
      <img src="/images/background-slider/{{this}}" class="img-responsive img-thumbnail" alt="{{this}}"> 
      <button type="button" class="btn btn-danger pull-right imgBgDel" file-name="{{this}}" > 
       Delete 
      </button> 
     </div> 
    {{/each}} 
    </div></br> 
{{/each}} 

スクリプト

$(function(){ 
    $('.delete-msg').hide(); 
    var url; 
    $(".imgBgDel").on("click", function(){ 
     var url = 'http://localhost:3000/api/imagesbg/' + $(this).attr('file-name'); 
     var allObj = $(this).parent(); 

     $.ajax({ 
     url: url, 
     type: 'DELETE', 
     success: function(result) { 
      allObj.remove(); 
      $('.delete-msg').slideToggle(); 
      setTimeout(function() {$('.delete-msg').slideToggle();}, 3000); 
     }, 
     error: function(status, xhr) { 
      console.log(status); 
      alert("An error occured: " + xhr.status + " " + xhr.statusText + " + " + status); 
     } 
    }); 
    }); 
}); 

index.js

router.delete('/api/imagesbg/:id', isAdmin, function(req, res, next){ 
    var filePath = '/images/background-slider/' + req.params.id; 
    console.log(filePath); 
}); //isAdmin check if logged user is admin 

フルapp.js

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 expressHbs = require('express-handlebars'); 
var mongoose = require('mongoose'); 
var session = require('express-session'); 
var passport = require('passport'); 
var flash = require('connect-flash'); 
var fs = require('fs'); 

var validator = require('express-validator'); 

var MongoStore = require('connect-mongo')(session); 


var index = require('./routes/index'); 
var userRoutes = require('./routes/user'); 
var adminRoutes = require('./routes/admin'); 


var app = express(); 
var options = { 
    user: 'xxx', 
    pass: 'xxx' 
}; 

mongoose.connect('mongodb://xxx', options); 

require('./config/passport'); 

// view engine setup 
app.engine('.hbs', expressHbs({defaultLayout: 'layout', extname: '.hbs'})); 
app.set('view engine', '.hbs'); 

// 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(validator()); 
app.use(cookieParser()); 
app.use(session({ 
    secret: 'xxx', 
    resave: false, 
    saveUninitialized: false, 
    store: new MongoStore({ 
    mongooseConnection: mongoose.connection 
    }), 
    cookie: { 
    maxAge: 180 * 60 * 1000 //how long session lives 180 minutes 
    } 
})); 
app.use(flash()); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(express.static(path.join(__dirname, 'public'))); 

//bootstrap and jquery 
app.use('/js', express.static(__dirname + '/node_modules/bootstrap/dist/js')); // redirect bootstrap JS 
app.use('/js', express.static(__dirname + '/node_modules/jquery/dist')); // redirect JS jQuery 
app.use('/css', express.static(__dirname + '/node_modules/bootstrap/dist/css')); // redirect CSS bootstrap 


app.use(function(req, res, next){ 
    res.locals.login = req.isAuthenticated(); 
    res.locals.adminLogin = (req.isAuthenticated()&&req.user.admin); 
    res.locals.session = req.session; 
    next(); 
}); 


app.use('/admin', adminRoutes); 
app.use('/user', userRoutes); 
app.use('/', index); 


// 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) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 

module.exports = app; 

とフルindex.js

var express = require('express'); 
var router = express.Router(); 
var BlogPost = require('../models/blogPost'); 
var csrf = require('csurf'); 
var passport = require('passport'); 
var fs = require('fs'); 




var csrfProtection = csrf(); 
router.use(csrfProtection); 

router.get('/landing-edit', isAdmin, function(req, res, next){ 
var messages = req.flash('error'); 
fs.readdir('public/images/background-slider', function(err, files){ 
     if(err){ 
      console.log(err); 
     } 
     var arrTmp = []; 
     var images = []; 
     for(var i in files){ 
      if(arrTmp.length == 3){ 
       images.push(arrTmp); 
       arrTmp = []; 
      } 
      arrTmp.push(files[i]); 
     } 
     if(arrTmp) 
      images.push(arrTmp); 
     console.log(images); 

     res.render('admin/landing-bg-admin', {messages: messages, hasErrors: messages.length>0, images: images}); 
    }); 


}); 

router.delete('/api/imagesbg/:id', isAdmin, function(req, res, next){ 
    var filePath = '/images/background-slider/' + req.params.id; 
    console.log(filePath); 
    ///res.send(filePath); 
}); 





module.exports = router; 

function isAdmin(req, res, next){ 
    if(req.isAuthenticated() && req.user.admin){ 
     return next(); 
    } 
    res.redirect('/'); 
} 
+0

index.jsのスニペットの最後にあるコメントは、「// isAdminがログインしたユーザがadminかどうかを確認する」と思われます。ユーザーがログインしているかどうか、そのユーザーに管理者権限があるかどうか最初に確認するロジックがあるように見えますか?あなたが提供したコードには、私が見ることができるものは403を投げるものは何もありません。このエラーは他の場所で発生している可能性があり、おそらく認証や承認に関連している可能性があります。 – Adam

+0

サーバサイドの 'DELETE'アクションハンドラを表示 –

+0

あなたのサーバコードを見せて'フィルタ 'があるかどうか確認 –

答えて

0

私は前にこれに非常に似たものを持っていました。根本的な原因は通常、$.ajaxなどのようにXHRリクエストを送信すると、要求にデフォルトで資格情報が含まれていないことです。。認証にパスポートを使用しているので、要求が資格情報なしでサーバーに送られると、パスポートはパスポートを停止し、ルートハンドラを削除する前に403を返します。私は$.ajaxためにこの問題を解決していない

は、具体的には、私はfetch APIを使用しますが、追加しよう:

xhrFields: { 
    withCredentials: true 
} 

あなた$.ajaxコールに。それでも解決しない場合は、追加してください:

username: "yourname" 
password: "yourpass" 

私は、根本的な原因は、あなたの要求が資格情報を送信していないということであると思いますわ。

+0

と同じですが、それでも同じです – The4ECH

0

サーバーでCORSが使用されているかどうかわかりません。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORSを参照してください。ページ上ののタイトルを確認してください。シンプルリクエスト

ご使用のサーバーがCORSを使用している場合は、他の回答パスポートから見たDELETEリクエストが問題になることはありません。 私がお勧めしたいのは、Ajax DELETEリクエストをPOSTリクエストに変更してそこから移動しようとすることです。

type: 'POST'を使用しても、画像を削除することができます。POST403: Forbiddenという正しい機能を使用することはおそらくありません。