Sails.js和Waterline:通过DB请求进行动态验证

时间:2015-07-02 21:39:54

标签: validation sails.js waterline

我将Sails 11.1和Waterline 2.11.2与MongoDB数据库一起使用。

我想使用in验证器为1个属性验证插入我的“文章”模型中的数据。 之前,我正在使用生命周期回调(beforeCreatebeforeUpdate特别是),但它会生成双重代码。

这里有模型,仅使用相关属性进行截断:

module.exports =
{
    schema: true,

    autoCreatedAt: false,
    autoUpdatedAt: false,

    attributes:
    {
        theme:
        {
            model: 'Theme',
            required: true
        }
    }
}

我知道如何静态定义它:

in: ['something', 'something other']

我知道如何调用我在constants.js文件中定义的常量:

defaultsTo: function ()
{
    return String(sails.config.constants.articleDefaultTheme);
}

但我希望获得我的数据库中的所有主题,以进行动态in验证。所以,我写了这个:

theme:
{
    model: 'Theme',
    required: true,
    in: function () 
    {
        Theme.find()
        .exec(function (err, themes) 
        {
            if (err)
            {
                return next({ error: 'DB error' });
            }
            else if (themes.length === 0)
            {
                return next({ error: 'themes not found' });
            }
            else
            {
                var theme_ids = [];

                themes.forEach(function (theme, i)
                {
                    theme_ids[i] = theme.theme_id;
                });

                return theme_ids;
            }
        });
    }
}

但它不起作用,我总是“1属性无效”错误。如果我静态地写它们,或者如果我用另一个DB请求检查beforeCreate方法,它会正常工作。 如果我sails.log()返回变量,则所有主题ID都在这里。

我尝试JSON.stringify()返回的变量,并尝试JSON.parse(JSON.stringify())它。我还尝试将theme.theme_id转换为带String()函数的字符串,但没有别的......

我做错了什么?或者这是一个错误?

您也可以在此处查看我的问题:Waterline GitHub issues

1 个答案:

答案 0 :(得分:2)

attributes范围内in范围内的模型配置当然会抛出错误,因为它不应该使用函数,特别是你的函数不返回任何内容,如果你强制它返回某件事,它会返回Promise所做的Theme.find()...

尝试使用不同的方法。存在Model Lifecycle Callbacks。您可以使用beforeCreatebeforeValidate之类的内容手动检查动态Theme,如果它无效,则会返回错误。

或者,如果使用标准DB关系可以实现,只需使用简单的DB关系。