提取请求期间未找到 Feathers 服务

Feathers service does not found during fetch request

我通过获取请求 post 向数据库添加新用户。 我得到的响应是 'POST http://localhost:3000/register 404 (Not Found)'。 问题在于,即使在将 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);

您使用的回调不会在 async 函数中等待,除非您将它们变成 JavaScript Promise,例如使用 utils.promfisy.

内置的 NodeJS

大多数当前的 NodeJS 库已经支持返回 Promises,这将使事情更容易阅读和遵循,并确保正确处理错误(在您的示例中,这两种情况都不会做任何事情)。

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?
    }
}

要解决这个问题,您应该 return 从服务主体中获取一些东西。 如果 'return' 在 promise 内,节点将其定义为不 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);
            });
    }
}

这样'data'只有操作成功才会return,所以我们可以在前端部分查看操作结果。