【问题标题】:'or' query with different data types in sails.js在sails.js 中使用不同数据类型的“或”查询
【发布时间】:2015-04-26 17:25:59
【问题描述】:

给定路线

GET /user/42
GET /user/dude

其中 42 是用户 ID,dude 是用户名。

所以,我想在我的控制器中有一个方法,在这两种情况下都返回用户。这里是:

// api/controllers/UserController.js
findOne: function(req, res) {
    User.findOne({
        or: [
            {id: req.params.id},
            {username: req.params.id}
        ]
    }).exec(function(err, user) {
        if (err) {
            return console.log(err);
        }
        res.json(user);
    });
},

当我尝试GET /user/42 时,一切都很好。

当我尝试GET /user/dude 时出现错误:

错误 (E_UNKNOWN) :: 遇到意外错误

错误:整数的输入语法无效:“dude”

似乎sails 拒绝处理{id: 'dude'},因为类型不匹配。

我正在使用sails 0.10.5 和sails-postgresql 0.10.9。那我做错了什么?

UPD:我知道如何解决问题。当然,我可以将 if 语句放入我的控制器并检查它得到的参数类型。实际上,我刚刚创建了两条带有正则表达式参数的路由,它们指向单个方法。

我的实际问题是为什么我不能用or 做到这一点。帆提供这种方式吗?

【问题讨论】:

    标签: javascript node.js postgresql sails.js waterline


    【解决方案1】:

    默认情况下,sails get 方法只支持 id 数字。你会需要 定义自定义路由并实现相关的api方法 支持使用字符串而不是数字的获取请求。


    技术细节: 要解决您的确切问题,您需要在您的 routes.js 中定义以下路由

    module.exports.routes = {
    ...
      '/user/get/:param': 'UserController.findByIDorName', 
    ...
    }
    

    这会将 /user/get/ 之后的任何内容作为名为“param”的参数传递给 findByIDorName 控制器方法。

    接下来您需要检查参数的类型并决定是否要根据 id 或名称获取用户信息,因此在您的 userController.js 中添加此函数

    findByIDorName : function (req, res) {
             if (isNaN(req.param)){
                  //find the user by his username after any validation you need
             }
             else {
                 //find the user by his id and return
             }
    }
    

    【讨论】:

    • 我愿意。我根本没有使用蓝图。
    • 我在路由和控制器中添加了一些详细信息。
    • 感谢您的尝试。我赞成你的回答,但它并没有解决我的实际问题。我更新问题以获取更多详细信息
    • findOne 和 populate 的 Sails 内部实现似乎有点不同,但你也违反了 populate 的法律:) 你应该检测类型(验证),然后将其传递给db 查询,这样您就不会在任何情况下针对字符串查询 id(可能下一个版本的sails 也会破坏填充?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2013-08-05
    • 2014-03-31
    • 2012-12-20
    相关资源
    最近更新 更多