Javascript Node.js AJAX删除403禁止
我尝试创建从服务器删除图像的方法。现在我只想处理删除请求并在控制台上显示文件路径。。。 服务器不处理我的请求并发送: jquery.min.js:4删除403(禁止) 我做错了什么 前部(把手.js) index.jsJavascript 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
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可能不是问题所在。
我建议您做的是尝试将ajaxDELETE
请求更改为POST
请求,然后从那里开始
使用
type:'POST'
,您仍然可以删除图像,使用POST
的正确功能,并且403:禁止的
可能不会出现。我不知道您的服务器是否使用CORS。看见检查页面上的简单请求标题
如果您的服务器正在使用CORS,它将不允许您执行删除
请求,因为从其他答案中可以看出,passport可能不是问题所在。
我建议您做的是尝试将ajaxDELETE
请求更改为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配置正确吗?您是否能够登录并查看在注销时无法查看的授权内容?我在你的后端代码中没有看到本地策略或任何其他策略。它没有帮助,仍然是相同的,仍然是相同的