FS.Collection图片ID不验证check()

时间:2014-12-23 19:42:58

标签: meteor

我正在尝试在FS.Collection中插入后保存图像ID。

插入数组

var item = {
    name: $(value).find('#name').val(),
    article: $(value).find('#article').val(),
    description: $(value).find('#description').val(),
    price: $(value).find('#price').val(),
    sizes: $(value).find('#sizes').val()
};
file = $(value).find('#attachmentName')[0].files[0];
if (file !== undefined) {
    Images.insert(file, function (err, fileObj) {
        item = _.extend(item, {
            image: fileObj._id.toString()
        });
    });
}
Meteor.call('collectionInsert', item, function(error, result) {
    if (error)
        return alert(error.reason);
    Router.go('collection', {_id: result._id});
});

collectionInsert方法

Meteor.methods({
collectionInsert: function(postAttributes) {
    check(Meteor.userId(), String);
    check(postAttributes, {
        name: String,
        article: String,
        description: String,
        price: String,
        sizes: String,
        image: String
    });
    var user = Meteor.user();
    var post = _.extend(postAttributes, {
        userId: user._id,
        author: user.profile.name,
        timestamp: new Date(),
        views: 0
    });
    var collectionId = Collections.insert(post);
    return {
        _id: collectionId
    };
}
});

然后我有异常

Exception while invoking method 'collectionInsert' Error: Match error: Missing key 'image'

在控制台日志中,我有项目值

...
image: "4J55dyGb5DpqbCXGG"
...

我正在尝试将check属性更改为 image:Match.Optional([String]) image:Match.Any - 没有效果

1 个答案:

答案 0 :(得分:0)

我认为这里的问题是你的插入方法是非阻塞的,这意味着在将它传递给方法调用之前你可能还没有收到fileObj或扩展item。也许你应该尝试在insert回调中调用方法,如下所示:

if (file !== undefined) {
    Images.insert(file, function (err, fileObj) {
        item.image = fileObj._id.toString(); // don't need _.extend

        // item should now be extended
        Meteor.call('collectionInsert', item, function(error, result) {
            if (error)
                return alert(error.reason);
            Router.go('collection', {_id: result._id});
        });
    });
}

顺便说一下,你应该存储$(value)的结果,而不是一遍又一遍地构造相同的jQuery对象。只是一个小的优化,但仍然提高了可读性。

var $value = $(value);
var item = {
    name: $value.find('#name').val(),
    ...
};