不确定如何在sails.js中执行此操作,但我希望能够在API上创建新对象时检查该对象的ID是否存在以及是否存在确实如此,发送409冲突响应,如果没有,则创建正常的对象。
为了便于讨论,我创建了一个品牌模型。
我假设我会覆盖BrandController中的create函数,根据req.param('id')
搜索品牌,如果存在,则发送错误响应。但是我不确定我是否正确地做到了这一点,因为我似乎无法正常工作。
有人有想法吗?
答案 0 :(得分:3)
我最终使用了针对此特定用例的策略。
在config/policies
下,我创建了一个isRecordUnique政策:
/**
* recordIsUnique
*
* @module :: Policy
* @description :: Simple policy to check that a record is unique
*
* @docs :: http://sailsjs.org/#!documentation/policies
*
*/
module.exports = function(req, res, next) {
Brand.findOne({ id: req.body.id}).done(function (err, brand) {
if (brand) {
res.send(409);
} else {
next();
}
});
};
这使我可以避免覆盖任何CRUD函数,它似乎符合策略的定义,只检查一件事。
为了将我的政策与我的创建功能联系起来,我通过添加:
修改了config/policies
BrandController: {
create: 'isRecordUnique'
}
就是这样。我花了太长时间才弄明白这一点,但我认为这是一个很好的方法。
答案 1 :(得分:0)
好吧,因为这是MVC,你正在思考控件应该强制执行这个逻辑。但是,由于这是主要ID的基本唯一性,因此模型应该知道/理解并帮助强制执行此操作。
答案 2 :(得分:0)
我使用 action2 解决了这个问题,因为它是处理特定用例的干净方式,它很容易定义我们在请求中需要什么以及我们想要在 action2 中作为响应发送什么,这里是通过定义 exits.invalid 来解决您问题的代码示例带有您要发送的状态代码。
module.exports = {
friendlyName: "Create",
description: "Create User.",
inputs: {
id :{
type : 'number',
},
},
exits: {
success:{
statusCode: 200,
},
invalid:{
statusCode: 409,
},
},
fn: async function (inputs, exits) {
var userData = await User.find( {id : inputs.id });
if(!userData[0]){
return exits.invalid({
message: "custom message you can send from here",
});
}
return exits.success({
message: "User id is unique",
});
},
};
无效将发送json
{
message: "custom message you can send from here",
}
状态为 409 / 冲突