Reputation: 2005
my node js router it's not handling the delete method but all the others it's handling well (GET, POST, UPDATE etc etc) but the delete does not reach the router and i can't figure why.
The ajax it's doing the request correctly at least it seems to be doing it.
ajax request:
function ajaxHelper(url, onSuccessArray, onErrorArray, onFinishArray, verb, data) {
verb = verb || "GET";
document.getElementById("loader").style.display = "block";
let xhr = new XMLHttpRequest();
xhr.open(verb, url);
xhr.responseType = "json";
xhr.addEventListener("load", function () {
document.getElementById("loader").style.display = "none";
let status = this.status;
if (status === 200) {
if (onSuccessArray) {
onSuccessArray.reverse();
onSuccessArray.forEach(function (onSuccess) {
onSuccess && onSuccess(xhr.response)
});
}
} else {
if (onErrorArray) {
onErrorArray.reverse();
onErrorArray.forEach(function (onErrorCallback) {
onErrorCallback && onErrorCallback(status, xhr.response);
})
}
}
if (onFinishArray) {
onFinishArray.reverse();
onFinishArray.forEach(function (onFinishCallback) {
onFinishCallback && onFinishCallback(status);
})
}
});
if (data) {
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify(data));
} else {
xhr.send();
}
}
function removePlayer(onSuccessArray, onErrorArray, onFinishArray, data) {
ajaxHelper("/players/delete-player", onSuccessArray, onErrorArray, onFinishArray, "DELETE", data);
}
app.js
let express = require('express');
let path = require('path');
let favicon = require('serve-favicon');
let logger = require('morgan');
let cookieParser = require('cookie-parser');
let bodyParser = require('body-parser');
let index = require('./routes/index');
let cups = require('./routes/route-cup');
let leagues = require('./routes/route-league');
let players = require('./routes/route-player');
let teams = require('./routes/route-team');
let app = express();
app.use(favicon(path.join(__dirname, 'public', '/images/favicon.png')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(cookieParser());
app.use('/cups', cups);
app.use('/leagues', leagues);
app.use('/players', players);
app.use('/teams', teams);
app.use(express.static("public", {
"index": "index.html"
}));
// catch 404 and forward to error handler
app.use(function (req, res, next) {
let 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;
router:
let express = require('express');
let router = express.Router();
let mysql = require("mysql");
let sqlHelper = require("../scripts/sql-helper");
router.get('/', function (req, res, next) {
let sqlQuery = "SELECT * FROM " + dbName + ".player;";
sqlHelper.executeSql(res, sqlQuery, function (rows, fields) {
res.json(rows);
})
});
router.get('/free-players', function (req, res, next) {
let sqlQuery = "SELECT * FROM " + dbName + ".player WHERE 'teamName' <> ''";
sqlHelper.executeSql(res, sqlQuery, function (rows, fields) {
res.json(rows);
})
});
router.post('/submit-player', function (req, res, next) {
let keys = objectHelper.getObjectKeys(req.body);
let values = objectHelper.getObjectValues(req.body);
let placeHolders = new Array(keys.length).fill("?");
let sqlQuery = "INSERT INTO " + dbName + ".`player` (" + keys.toString() + ") VALUES (" + placeHolders.toString() + ")";
sqlQuery = mysql.format(sqlQuery, values);
sqlHelper.executeSql(res, sqlQuery, function (rows, fields) {
res.json(rows);
});
});
router.put('/update-player', function (req, res, next) {
let keys = objectHelper.getObjectKeys(req.body);
let values = objectHelper.getObjectValues(req.body);
let sqlQuery = "UPDATE " + dbName + ".`player` SET ";
let valuePair = [];
keys.forEach(function (key, index) {
if (values[index] !== null) {
valuePair.push(key + "=" + "'" + values[index] + "'");
} else {
valuePair.push(key + "=" + values[index]);
}
});
sqlQuery = sqlQuery + valuePair.toString() + " WHERE " + valuePair[0];
sqlHelper.executeSql(res, sqlQuery, function (rows, fields) {
res.json(rows);
});
});
router.delete('/delete-player', function (req, res, next) {
let sqlQuery = "DELETE " + dbName + ".`player` WHERE id=" + req.body;
sqlHelper.executeSql(res, sqlQuery, function (rows, fields) {
res.json(rows);
});
});
module.exports = router;
Server log:
GET /players 304 53.636 ms - -
GET /teams 304 46.161 ms - -
GET /players 304 13.676 ms - -
DELETE /players/delete-player 400 3059.064 ms - 1397
Error: No default engine was specified and no extension was provided.
Upvotes: 0
Views: 1379
Reputation: 203304
You're getting a 400 response ("Bad Request") because you're most likely sending a (JSON-encoded) string to the backend.
However, when using application/json
, the data that you send should be either a (JSON-encoded) object, or an array, but not a string. That's why the server returns a 400.
A more typical solution would be to pass the property to delete in the URL itself:
DELETE /players/delete-player/jack
You would use a route like this:
router.delete('/delete-player/:name', ...)
And access the name as req.params.name
(which would equal "jack" in this example).
More info on route parameters here: http://expressjs.com/en/guide/routing.html#route-parameters
Upvotes: 2