【问题标题】:Node js router not handling deleteNode js路由器不处理删除
【发布时间】:2017-07-10 13:02:16
【问题描述】:

我的节点 js 路由器没有处理删除方法,但所有其他方法都处理得很好(GET、POST、UPDATE 等),但删除没有到达路由器,我不知道为什么。

它正确执行请求的 ajax 至少看起来正在执行。

ajax 请求:

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;

路由器:

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;

服务器日志:

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.

【问题讨论】:

  • 请了解SQL注入...
  • 这只是一个用于学习目的的测试应用程序,我知道它容易受到 sql 注入的影响
  • 著名的遗言 ;D 无论如何,如果请求没有到达处理程序,服务器发回的响应是什么?
  • P.S.使用/players/12 而不是players/12/"action"-player 因为方法定义了“动作”。
  • 400 表示“错误请求”。通常,您不会发送带有 DELETE 请求的正文,但 Express 并不真正关心,因此不确定 400 来自何处。第二个错误是由于未指定模板引擎并尝试渲染模板(在错误处理程序中)引起的。

标签: javascript node.js ajax express


【解决方案1】:

您收到 400 响应(“错误请求”),因为您很可能正在向后端发送(JSON 编码)字符串。 p>

但是,当使用application/json 时,您发送的数据应该是(JSON 编码的)对象或数组,而不是字符串。这就是服务器返回 400 的原因。

更典型的解决方案是在 URL 本身中传递要删除的属性:

DELETE /players/delete-player/jack

你会使用这样的路线:

router.delete('/delete-player/:name', ...)

并以req.params.name 访问名称(在本例中等于“jack”)。

更多关于路由参数的信息:http://expressjs.com/en/guide/routing.html#route-parameters

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多