Javascript Node.js AJAX删除403禁止

Javascript Node.js AJAX删除403禁止,javascript,jquery,node.js,ajax,Javascript,Jquery,Node.js,Ajax,我尝试创建从服务器删除图像的方法。现在我只想处理删除请求并在控制台上显示文件路径。。。 服务器不处理我的请求并发送: jquery.min.js:4删除403(禁止) 我做错了什么 前部(把手.js) index.js router.delete('/api/imagesbg/:id', isAdmin, function(req, res, next){ var filePath = '/images/background-slider/' + req.params.id; conso

我尝试创建从服务器删除图像的方法。现在我只想处理删除请求并在控制台上显示文件路径。。。 服务器不处理我的请求并发送:

jquery.min.js:4删除403(禁止)

我做错了什么

前部(把手.js)

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;
和full 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('/');
}

我以前也有过类似的经历。根本原因通常是,当发送一个XHR请求时,就像您使用
$.ajax
默认情况下,请求不包括凭据。由于您使用passport进行身份验证,因此当请求在没有凭据的情况下发送到服务器时,passport会停止请求并在到达删除路由处理程序之前返回403

我还没有为
$解决这个问题。ajax
具体来说,我使用了
获取
API,但尝试添加:

xhrFields: {
     withCredentials: true
}
到您的
$.ajax
调用。如果不起作用,请尝试添加:

username: "yourname"
password: "yourpass"

我敢打赌,根本原因是您的请求没有发送您的凭据。

我以前也遇到过类似的情况。根本原因通常是,当发送一个XHR请求时,就像您使用
$.ajax
默认情况下,请求不包括凭据。由于您使用passport进行身份验证,因此当请求在没有凭据的情况下发送到服务器时,passport会停止请求并在到达删除路由处理程序之前返回403

我还没有为
$解决这个问题。ajax
具体来说,我使用了
获取
API,但尝试添加:

xhrFields: {
     withCredentials: true
}
到您的
$.ajax
调用。如果不起作用,请尝试添加:

username: "yourname"
password: "yourpass"

我敢打赌根本原因是您的请求没有发送您的凭据。

我不知道您的服务器是否使用CORS。看见检查页面上的简单请求标题

如果您的服务器正在使用CORS,它将不允许您执行
删除
请求,因为从其他答案中可以看出,passport可能不是问题所在。 我建议您做的是尝试将ajax
DELETE
请求更改为
POST
请求,然后从那里开始


使用
type:'POST'
,您仍然可以删除图像,使用
POST
的正确功能,并且
403:禁止的
可能不会出现。

我不知道您的服务器是否使用CORS。看见检查页面上的简单请求标题

如果您的服务器正在使用CORS,它将不允许您执行
删除
请求,因为从其他答案中可以看出,passport可能不是问题所在。 我建议您做的是尝试将ajax
DELETE
请求更改为
POST
请求,然后从那里开始

使用
type:'POST'
,您仍然可以删除图像,使用
POST
的正确功能,并且
403:禁止的
可能不会出现。

router.get('/api/imagesbg/:id',isAdmin,(req,res,next)=>{
常量查询={u id:req.params.id}
如果(!ObjectID.isValid(请求参数id)){
返回res.render('error',{message:“error未找到给定id”});
}
Blogpost.findOneAndRemove({
_id:查询,
_creator:req.user.\u id//如果您有creator id,请删除它
})。然后((post)=>{
如果(!post){
返回res.status(400.send();
}
res.redirect('/home');
}).catch((e)=>{
res.status(400.send();
});
});
router.get('/api/imagesbg/:id',isAdmin,(req,res,next)=>{
常量查询={u id:req.params.id}
如果(!ObjectID.isValid(请求参数id)){
返回res.render('error',{message:“error未找到给定id”});
}
Blogpost.findOneAndRemove({
_id:查询,
_creator:req.user.\u id//如果您有creator id,请删除它
})。然后((post)=>{
如果(!post){
返回res.status(400.send();
}
res.redirect('/home');
}).catch((e)=>{
res.status(400.send();
});

});
index.js代码段末尾的注释似乎很有用
//isAdmin检查登录用户是否为admin
。看起来有其他逻辑首先检查用户是否已登录,以及该用户是否具有管理员权限?在你提供的代码中,我看不出会抛出403。该错误一定是由其他地方引起的,可能与身份验证和/或授权有关。请向我们展示您的服务器端
删除
操作手柄向我们展示您的服务器代码以查看是否存在
过滤器
我编辑了主要帖子并添加了完整的服务器代码您确定passport配置正确吗?您是否能够登录并查看在注销时无法查看的授权内容?我在您的后端代码中没有看到本地策略或任何其他策略。index.js代码段末尾的注释似乎很有用
//isAdmin检查登录用户是否为admin
。看起来有其他逻辑首先检查用户是否已登录,以及该用户是否具有管理员权限?在你提供的代码中,我看不出会抛出403。该错误一定是由其他地方引起的,可能与身份验证和/或授权有关。请向我们展示您的服务器端
删除
操作手柄向我们展示您的服务器代码以查看是否存在
过滤器
我编辑了主要帖子并添加了完整的服务器代码您确定passport配置正确吗?您是否能够登录并查看在注销时无法查看的授权内容?我在你的后端代码中没有看到本地策略或任何其他策略。它没有帮助,仍然是相同的,仍然是相同的