【问题标题】:How to separate the variables in the server side for each user?如何为每个用户分离服务器端的变量?
【发布时间】:2016-03-09 10:50:21
【问题描述】:

我想将用户的 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”分开,以免它们相互矛盾?

【问题讨论】:

  • 我知道为什么会发生这种情况,但我不清楚为什么在写入数据库之前将这些值存储在服务器的内存中 - 这不是正常模式。为什么不将它们作为参数传递给submitPost
  • @DavidWeldon 不确定是否可以将它们作为参数传递给提交帖子,如果可能的话,这将解决我的问题。我认为不可能的原因是通过使用问题中包含的方法从客户端获取这些变量的值。我错了这是不可能的吗?有没有办法可以将它们传递给 submitPost?我希望这是可能的
  • 也许我误解了这个问题。似乎您在说:(1)客户端将值 X 存储在 Session var 中,(2)客户端调用一个方法将 X 存储在服务器的内存中,(3)客户端调用服务器上的 submitPost 从中读取 X自己的记忆。为什么不跳过第 2 步,在调用 submitPost 时将来自客户端的 X 作为第二个参数(在 app 之后)传递?如果它在 Session 变量中,您可以在调用时从应用程序的任何位置读取它。
  • @DavidWeldon 我认为这不可能,因为 submitPost 方法的调用方式,我编辑了我的问题以显示它是如何调用的,请纠正我的错误
  • 这只是一个限制,如果您在创建表单时通过传入方法名称来限制自己。我不是自动表单专家,但在快速浏览文档后,您似乎可以执行 normal 提交处理程序并使用正确的值调用该方法。

标签: meteor


【解决方案1】:

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

如果数据是由用户提交的(即预览图像 url 或代码 url),那么您应该在提交表单中一次提交所有这些。

如果数据以某种方式生成(例如,如果您上传图像,然后需要获取该图像的 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) {

        }
    }
});

【讨论】:

  • 我是新的流星,不知道如何使用回调,所以现在正在检查它们,如果它有效,将批准你的答案,谢谢:)
  • 方法调用可以返回数据:只需使用return &lt;your-data&gt;; 然后在客户端,当您调用方法时,请在此处执行Meteor.call("methodName', params, function(error, data) { if (!error) {console.log(data); } }); full doc:docs.meteor.com/#/full/meteor_call
  • 根据我的理解,使用回调我可以在客户端使用方法的返回值。我实际上将这些值从客户端传递到服务器,因此它们实际上在客户端上可用,而无需调用该方法。如果您的意思是其他方式,请告诉我,如果我误解了回调,请纠正我
  • 如果您有办法让我使用客户端的这些值在 submitPost 方法中一次提交它们,请告诉我,这将解决我的问题
  • 我不明白您的问题:您在客户端上有变量,要在您的 submitPost 中提交它们,只需将它们作为参数传递,或者作为一个对象(通过将所有参数打包到一个对象)或作为单独的参数。 Meteor.call('myMethod', {app: app, pi:pi, url:url, image:image}, function(err,data){});Meteor.call('myMethod', app, pi, url, image, function(err,data){});
猜你喜欢
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多