Express не возвращает HTTP-ответ от одного контроллера, но делает это в других - PullRequest
0 голосов
/ 18 января 2019

Спасибо, что заглянули в мой вопрос.

У меня есть узел / экспресс-сервер, настроенный с помощью файла server.js, который вызывает urls.js, который, в свою очередь, вызывает контроллеры для обработки http-запросов, и все они настроены одинаково, и все работают нормально, кроме одного.

Это мой OrderController. OrderController.js никогда не вызывается и, следовательно, никогда не возвращает никаких HTTP-ответов, даже если я уверен, что он должен вызываться.

Я пытался добавить операторы журналирования по всему OrderController.js, но они никогда не запускаются. Ничто в моем OrderController.js не работает вообще.

Я тщательно проверил свой файл urls.js, но не могу понять, почему не удалось загрузить OrderController, в то время как все остальные мои 8 контроллеров работают нормально.

Я добавил операторы регистрации в мой файл server.js, чтобы убедиться, что мой файл server.js действительно обрабатывает все http-запросы и передает их правильно в мой файл urls.js.

Я добавил операторы logging в мой файл urls.js, чтобы подтвердить, что он выполняется.

Я зарегистрировал контроллеры, оба требуют (OrderController.js) и мои другие контроллеры, и осмотрел сброшенные объекты json, но не смог определить что-либо отличное или ошибочное из полученного мной вывода.

Хранилище: https://github.com/allenchan3/foodproject/tree/40a43231ae49989a35fb0c004a897bbee69fe669

Теоретически проблема должна быть где-то в urls.js :

const path = require("path");
const staticFilesError = require("./errors").errorHTML;
module.exports = function(app, staticDir) {
    const loginRegController = require(path.join("..","controllers","LoginRegController"));
    const controllers = {
        'categories': require(path.join("..","controllers","CategoryController")),
        'diningrooms':require(path.join("..","controllers","DiningRoomController")),
        'ingredients':require(path.join("..","controllers","IngredientController")),
        'items':      require(path.join("..","controllers","ItemController")),
        'options':    require(path.join("..","controllers","OptionController")),
        'orders':     require(path.join("..","controllers","OrderController")),
        'tables':     require(path.join("..","controllers","TableController")),
        'users':      require(path.join("..","controllers","UserController")),
    };

    for (key in controllers) {
        app.use("/api/"+key, controllers[key]);
    }
    app.use(loginRegController);
    app.get(/^\/api\//, (req, res) => res.status(404).json({"error":req.url+" not found"}));
    app.get("*", (_,res) => res.sendFile(staticDir+"/index.html"));
}

Я просто пытаюсь сделать HTTP GET-запросы на /api/orders/ и получить что-то от контроллера заказов (в настоящее время он должен получить список всех заказов из моей базы данных). Я также сделал обработчик для /hello, поэтому /api/orders/hello должен хотя бы что-то возвращать. Что происходит на самом деле, так это то, что http-ответ никогда не приходит, даже 404, и я понятия не имею, почему.

1 Ответ

0 голосов
/ 18 января 2019

Я клонировал ваш репозиторий и смог воспроизвести ошибку.

Похоже, что в authentication.js функция handleOrders () обрабатывает только пользователя, являющегося менеджером, барменом, сервером или кассиром. Если req.session.userType не задан или он равен cook или customer, он не обрабатывается оператором if и будет зависать бесконечно.

Можете ли вы попытаться вызвать API как пользователь с другим типом и подтвердить это?

Вам может понадобиться еще один, как показано ниже, чтобы бросить 403, если пользователь имеет неправильный тип.

function handleOrders(req, res, next) {
    console.log('handling')
    if (req.session.userType == "manager") {
        console.log('i am manager')
        next();
    } else if (["bartender","server","cashier"].indexOf(req.session.userType) > -1) {
        console.log('am i a cahsier or server or bartender')
        if (req.url == "/api/order" && req.method == "GET") {
            console.log('in this if')
            next();
        }
        else {
            //not a get
            Order.findById(req.params.id,(err,data)=>{
                if (err) {
                    console.log(err);
                    res.status(500).json(err);
                } else {
                    console.log(data);
                    next();
                }
            });
        }
    } else res.status(403).send(errors.forbidden);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...