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

Validation Sails.js和Waterline:通过DB请求进行动态验证,validation,sails.js,waterline,Validation,Sails.js,Waterline,我使用Sails 11.1和Waterline 2.11.2以及MongoDB数据库 我想使用validator for 1属性中的,验证插入到“Article”模型中的数据。 以前,我使用生命周期回调(尤其是beforeCreate和beforeUpdate)进行工作,但它会生成双重代码 这里有一个模型,被截断的只是有问题的属性: module.exports = { schema: true, autoCreatedAt: false, autoUpdatedAt:

我使用Sails 11.1和Waterline 2.11.2以及MongoDB数据库

我想使用validator for 1属性中的
,验证插入到“Article”模型中的数据。
以前,我使用生命周期回调(尤其是
beforeCreate
beforeUpdate
)进行工作,但它会生成双重代码

这里有一个模型,被截断的只是有问题的属性:

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);
}
但是我想在数据库中获取所有主题,以便在
验证中具有动态的
。所以,我写了这个:

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())
it。我还尝试使用
string()
函数将
theme.theme\u id
转换为一个字符串,但除此之外

我做错了什么?还是一只虫子


你也可以在这里检查我的问题:

模型在你的
属性
范围内的配置当然会抛出一个错误,因为它不应该使用函数,特别是你的函数不返回任何东西,如果你强迫它返回一些东西,它将返回
Promise
,即
Theme.find()

尝试使用不同的方法。存在着许多问题。您可以使用
beforeCreate
beforeValidate
之类的方法手动检查动态
主题
,如果无效,则返回错误


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

它不应该使用函数?你确定吗,当我使用函数获取常数时,它们工作得很好?关于生命周期回调,我忘了在想到像这样在
中使用
属性之前提到我正在使用它们。把它加到我原来的问题上。“或者,如果使用标准DB关系可以实现,那么只需使用简单的DB关系即可。”:当我使用MongoDB时,我如何使用Sails实现这一点(也添加到我原来的问题中,对不起…)?如果它可以是一个函数,我很抱歉。但它应该返回一个表示字段配置的对象,而不是promise。因为承诺作用域/回调/任何异步作用域都不是同步的,所以它不能用于定义配置字段。