Sails.js如何在创建/更新请求中忽略用户传入ID,使用自增ID?
嘿,这个需求在Sails.js里其实很好解决,我给你两种实用的实现思路,你可以根据自己的项目场景选:
方法一:用模型生命周期钩子(推荐,最彻底)
这种方法是在模型层面拦截,不管是通过控制器请求还是直接调用ORM方法(比如YourModel.create()),都会生效,能从根源上确保用户传入的ID被忽略。
在你的模型文件(比如api/models/YourModel.js)里添加生命周期钩子:
module.exports = { attributes: { // 这里写你的其他属性,比如: username: { type: 'string', required: true }, email: { type: 'string', unique: true, required: true } // 注意:Sails.js默认会自动生成自增的id字段,不需要额外定义 }, // 创建记录前触发:移除用户传入的id,让数据库自增生成 beforeCreate: function(valuesToSet, proceed) { delete valuesToSet.id; return proceed(); }, // 更新记录前触发:禁止修改id字段,直接删除传入的id值 beforeUpdate: function(valuesToUpdate, proceed) { delete valuesToUpdate.id; return proceed(); } };
为什么推荐这个? 因为它覆盖了所有可能的写入场景——不管是前端传的id,还是后端其他服务不小心带的id,都会被自动清除,完全保证id由数据库自增控制。
方法二:在控制器里手动处理
如果你只想针对控制器的请求做处理,也可以直接在create和update的动作里删除请求体中的id:
在对应的控制器文件(比如api/controllers/YourModelController.js)里修改:
module.exports = { // 创建接口 create: async function(req, res) { // 先删掉请求体里的id delete req.body.id; try { const newItem = await YourModel.create(req.body).fetch(); return res.ok(newItem); } catch (err) { return res.serverError(err); } }, // 更新接口 update: async function(req, res) { // 同样移除请求体里的id,确保只能更新URL参数指定的记录 delete req.body.id; const targetId = req.param('id'); try { const updatedItem = await YourModel.updateOne({ id: targetId }) .set(req.body) .fetch(); if (!updatedItem) { return res.notFound('记录不存在'); } return res.ok(updatedItem); } catch (err) { return res.serverError(err); } } };
注意: 这种方法只对控制器的请求生效,如果后端有其他地方直接调用YourModel.update()或者create(),就没办法拦截了,所以适合场景比较单一的项目。
最后再确认下:如果你的模型id字段不是默认的自增类型,记得在attributes里明确配置:
id: { type: 'number', autoIncrement: true, columnName: 'id' }
不过Sails.js默认就是这个配置,所以一般不用额外改。
内容的提问来源于stack exchange,提问作者WalksAway
相关产品推荐
相关产品推荐

