提取请求期间未找到 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,所以我们可以在前端部分查看操作结果。
我通过获取请求 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 库已经支持返回 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,所以我们可以在前端部分查看操作结果。