Служба перьев не найдена во время запроса на получение - PullRequest
0 голосов
/ 23 сентября 2019

Я делаю пост запрос, чтобы добавить нового пользователя в базу данных.Ответ, который я получаю: «POST http://localhost:3000/register 404 (не найден)».Проблема заключается в том, что даже после возврата 404 во внешний интерфейс сервер продолжает работу и добавляет пользователя в базу данных.

Запрос выборки во внешнем интерфейсе:


let res = await fetch('http://localhost:3000/register', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                login: login,
                password: password,
                role: role
            })
        });

Служба внутренних перьев:


const registrator = {
    async create(data, params) {
        let Model = app.get('Model');
        Model.create({ login: data.login, password: data.password }, (err) =>{
            if (err) {
                return err;
            }
            else {
                Right.create({ login: data.login, rights: data.role },(err)=>{
                    if (err) {
                        Model.findOneAndRemove({ login: data.login });
                        return err;
                    }
                    else {
                        return data;
                    }
                });
            }
        });
    }
}

Строка, определяющая путь к этой службе:


app.use('/register', registrator);

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вы используете обратные вызовы, которые не ждут в функции async, если вы не превратите их в Обещание JavaScript, например, используя встроенный в NodeJS utils.promfisy .

Самый последний NodeJSбиблиотеки поддерживают возврат обещаний, которые значительно облегчат чтение и следование, а также обеспечат правильную обработку ошибок (в вашем примере это ничего не даст в любом случае).

const registrator = {
    async create(data, params) {
        const Model = app.get('Model');
        const login = await Model.create({ login: data.login, password: data.password });
        const right = await Right.create({ login: data.login, rights: data.role });

        // check for errors and call this if necessary
        // await Model.findOneAndRemove({ login: data.login });

        return right; // login?  what does your client expect?
    }
}
0 голосов
/ 26 сентября 2019

Чтобы это исправить, вы должны вернуть что-то из основной части сервиса.Если 'return' находится внутри обещания, узел определяет его как сервис, который ничего не возвращает, поэтому мы получаем эту ошибку.Мой сервис после исправления:

const registrator = {
    async create(data, params) {
        let Model = app.get('Model');
        return await Model.create({ login: data.login, password: data.password })
            .then(() => {
                Right.create({ login: data.login, rights: data.role })
            })
            .then(() => {
                return data;
            }).catch(err => {
                Model.findOneAndRemove({ login: data.login });
                Sentry.captureException(err);
            });
    }
}

Таким образом, «данные» будут возвращаться только в случае успешной операции, поэтому мы можем проверить результат операции в части внешнего интерфейса.

...