在Sails中修改路由以使用除id之外的其他内容?

时间:2014-08-23 17:32:39

标签: sails.js

我有一个网络应用程序,它通过套接字与我的后端node.js + sails app对话。

套接字的默认路由使用id。例如

io.socket.get('/chatroom/5')

我的应用不会对用户进行身份验证,因此我希望ID是随机的,所以没有人可以猜到它。但是,id是由mongoDB生成的,并不是随机的。

结果,我想使用其他字段(a.e.“randomId”)并更新此模型的路由以使用此字段而不是id。

最好的方法是什么?

P.S。看起来我必须使用政策,但仍然在努力弄清楚我应该做些什么。

2 个答案:

答案 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'
}