如何为每个用户分离服务器端的变量?

时间:2016-03-08 15:26:08

标签: meteor

我想将用户的URL存储到数据库中。到目前为止,我已在客户端创建了Session变量并将值存储在那里,然后使用Meteor方法将它们传递给服务器。

这些是执行此操作的方法

screenshotsURLS: function (sshots) {
   check(sshots, [String]);
   // Products.update({},{$set:{screenShots:sshots}});
   scs = sshots.slice();
      console.log(scs);
  },
  previewImageUrl: function (url) {
   check(url, String);
   pi = url;
   console.log(pi);
  },
  sourceCodeUrl: function (url) {
   check(url, String);
   zip = url;
   console.log(zip);
  }

这三个变量“scs,pi,zip”初始化如下:

var zip;
var pi;
var scs = [];

我的代码工作正常,我设法将变量的值存储在我的集合中,问题是当我从两个浏览器打开网站并调用其中的函数时。上面的变量将具有调用该函数的最后一个的值。

他们是这样的集合中的商店:

submitPost: function (app) {
    // Console.log('new App:', app);
    check(app, {
      title: String,
      description: String,
      category: String,
      price: Number
    });
    var knownId = Products.insert(app);
    Products.update({ _id: knownId }, { $set:{previewImage: pi, sourceCode: zip }});

  }

并且scs使用autoValue返回值

screenShots: {
    type: [String],
    autoValue: function() {
      return scs;
    }
  }

对于submitPost,它是以这种方式从html文件中的quickForm调用的

 {{> quickForm collection="Products" id="submitPostForm"
  type="method" meteormethod="submitPost" omitFields="createdAt, previewImage, screenShots, sourceCode, userID"}}

用户点击提交按钮后,将触发submitPost。

AutoForm.hooks实现

AutoForm.hooks({
    submitPostForm: {  //<--- this is the id of your form
        before: {  //<-- before submit
            methodName: function (doc) {  //<-- get the doc to be submitted

                //HERE YOU CAN MANIPULATE THE FORM FIELDS BEFORE SUBMIT
                var previewImage = Session.get("previewImageURL")
                if (previewImage) {
                    doc.previewImage = previewImage;
                }

                var sourceCode = Session.get("sourceCodeURL");
                if (sourceCode) {
                    doc.sourceCode = sourceCode;
                }

                var screenshots = Session.get("screenshots");
                if (screenshots) {
                    doc.screenShots = screenshots;
                }
                return doc;
            }
        },
        onSuccess: function (formType, result) {

        },
        onError: function (formType, error) {

        }
    }
});

我相信我的AutoForm.hooks由于某些原因不起作用,因为当我尝试console.log(“previewImage”)时没有任何反应!

如何为每个用户分隔变量“scs,pi,zip”以使它们不矛盾?

1 个答案:

答案 0 :(得分:1)

在我看来,你无缘无故地使事情变得复杂:

如果数据是由用户提交的(即预览图片网址或代码网址),那么您应该在提交表单中一次提交所有内容。

如果以某种方式生成数据(如果您上传图像,然后需要获取该图像的url以在预览中显示)然后上传,并返回图像url是上传返回回调,以使其可用到你的形式。

当您提交表单时,请立即使用从服务器生成的信息提交所有内容并将其发送回客户端。

所以无论你在方法调用上做什么,只需使用return pi;return url;或者你需要从该调用返回的任何内容,返回方法回调中的id。

修改

似乎问题与将额外的参数传递给表单有关。

这是使用表格挂钩完成的:

{{> quickForm
                collection="Product"
                id="create"
                type="method"
                meteormethod="insertProduct"
                doc=doc
                }}



AutoForm.hooks({
    create: {  //<--- this is the id of your form
        before: {  //<-- before submit
            method: function (doc) {  //<-- get the doc to be submitted

                //HERE YOU CAN MANIPULATE THE FORM FIELDS BEFORE SUBMIT
                var image = Session.get('imagePreview');
                if (image) {
                    doc['preview'] = image;
                }
                return doc;
            }
        },
        onSuccess: function (formType, result) {

        },
        onError: function (formType, error) {

        }
    }
});