我有一个网络应用程序,它通过套接字与我的后端node.js + sails app对话。
套接字的默认路由使用id。例如
io.socket.get('/chatroom/5')
我的应用不会对用户进行身份验证,因此我希望ID是随机的,所以没有人可以猜到它。但是,id是由mongoDB生成的,并不是随机的。
结果,我想使用其他字段(a.e.“randomId”)并更新此模型的路由以使用此字段而不是id。
最好的方法是什么?
P.S。看起来我必须使用政策,但仍然在努力弄清楚我应该做些什么。
答案 0 :(得分:1)
您不必在应用中使用默认蓝图路线;您始终可以使用自定义控制器方法或turn them off entirely覆盖它们。
GET /chatroom/:id
方法会自动路由到 ChatroomController.js 文件的find
操作。如果您没有自定义操作,则使用蓝图操作。因此,在您的情况下,您可以在 ChatroomController.js 中定义类似以下内容:
find: function (req, res) {
// Get the id parameter from the route
var id = req.param('id');
// Use it to look up a different field
Chatroom.find({randomId: id}).exec(function(err, chatrooms) {
if (err) {return res.serverError(err);}
// Subscribe to these rooms (optional)
Chatroom.subscribe(req, chatrooms);
// Return the room records
return res.json(chatrooms);
});
}
如果您不喜欢名称find
或参数id
,则可以在 config / routes.js 中设置自己的路线:
"GET /chatroom/:randomid": "ChatroomController.myFindActionName"
另外,重新:
套接字的默认路由使用id。
这些路由不仅适用于套接字 - 它们也会响应常规的HTTP请求!
答案 1 :(得分:0)
我制定了一项政策。此策略将randomId(传递为:id)转换为实际ID,并将其保存在req.options.id中(Sails将接收)。
module.exports = function(req, res, next) {
var Model = req._sails.models[req.options.model];
var randomId = req.params.all()['id'];
Model.findOne().where({ randomId: randomId }).exec(function(err, record) {
req.options.id = record.id;
return next();
});
};
我将此政策应用于findOne并更新我的控制器的操作:
ChatRoomController: {
findOne : 'useRandomId',
update : 'useRandomId'
}