【问题标题】:Meteor mongo sessionsMeteor mongo 会话
【发布时间】:2017-12-21 23:04:50
【问题描述】:

我正在开发我的域生成应用程序,它提供不同语言的域名。

是否可以在用户会话中存储 mongo 集合?所以每个用户都可以看到不同的收集结果。我有一个服务器端 api 调用,数据进入 mongo 集合:

Meteor.methods({
  translateToEn: function(){
    var arrayy = Help.find().fetch();
    var text = arrayy[0].text;
   var final;
   var myJSON;

    Typed.remove({});

    var translate = require('yandex-translate-api')('trnsl.1.1.20170424T153548Z.48f645437a55346f.e53fc386af70fd7d7f7138ae23b6c79fb3a5def9');
    translate.translate(text, { to: 'en'},Meteor.bindEnvironment( function(err, res) {

    myJSON = JSON.stringify(res.text);
    myJSON = myJSON.replace(/\s/g, '');
    myJSON = JSON.parse(myJSON);
    myJSON.toString()
    final = myJSON;
   var geras = final.toString();
   var naujas = Diacritics.remove(geras);

     final = naujas;

    var array = [{"text": " "}]
    var ends = [{"text": ".com"},{"text": ".co.uk"},{"text": ".net"},{"text": ".org"},{"text": ".eu"},{"text": ".biz"},{"text": ".blog"},{"text": ".in"}]
    var sug;

    for(var i=0; i<8; i++)
    {
        var randomIndex = Math.floor( Math.random() * array.length );
        var randomIndex2 = Math.floor( Math.random() * ends.length );
        var element = array[randomIndex].text;
        var end = ends[randomIndex2].text;
         sug = final + element+end;
         sug = sug.replace(/\s/g, '');
         Typed.insert({
         text: sug,
         createdAt: new Date(), 
         lang: res.lang });

    }

url = 'https://api.ote-godaddy.com/v1/domains/available?checkType=FAST';

headers = {
    "Authorization": "sso-key 2s7YSCfHkx_Xsfgx2tB1fV4WVrdd8VQuz:XsfkhRdwfMCm633B7GT6qz",
    "Content-Type": "application/json",
    "Accept": "application/json"
}

var arrays = Typed.find().fetch();
var test = arrays[0].text+' ';
var lang = arrays[0].lang;
console.log(lang);
for(var i = 1; i<arrays.length-1; i++)
{
 test = test + arrays[i].text+' ';
}
test=test+arrays[arrays.length-1].text;
logs = test.split(" ");
//console.log(logs);

HTTP.post(url,{
    data: logs,
    headers : headers
}, function( error, response ) {

  if ( error ) {
    console.log( error );
  } else {
   var results = JSON.parse(response.content);

  for(i =0; i< results.domains.length; i++){
     if(results.domains[i].price == null)
     {
       results.domains[i].price = "undefined";
     }
     if(results.domains[i].available == false)
     {
       results.domains[i].available = "false";
       TransToEnF.insert({domain: results.domains[i].domain, available: results.domains[i].available,definitive: results.domains[i].definitive,price: results.domains[i].price,currency: results.domains[i].currency, Buy:"Buy", lang:lang, translation:final});
     }
      if(results.domains[i].available == true)
     {
       results.domains[i].available = "true";
       TransToEnT.insert({domain: results.domains[i].domain, available: results.domains[i].available,definitive: results.domains[i].definitive,price: results.domains[i].price,currency: results.domains[i].currency, Buy:"Buy", lang:lang, translation:final});
     }
  }
  }
});
Typed.remove({});
}));
}});

我从客户端提交事件中调用此方法,如下所示:

Template.search.events({
  'submit .new-input'(event) {

    Meteor.call('remove',function(){});
    event.preventDefault();


    const target = event.target;
    const text = target.text.value;
    Help.insert({text: text});
    Place.insert({text: text,createdAt: new Date()});
    Meteor.call('translateToEn',function(){});

    target.text.value = '';
Meteor._reload.reload();
  },

并使用助手打印数据:

//available domains
Template.search.helpers({
  transToEnT: function(){
  return Session.get(TransToEnT.find()) ;
  }
});

Template.search.helpers({     //taken domains
  transToEnF: function(){
  return TransToEnF.find();
  }
});

不幸的是,如果有超过 1 个用户,他们都会看到相同的结果,页面会在其中一个提交文本字段后立即重新加载。你们有解决这个问题的方法吗?

【问题讨论】:

    标签: mongodb session meteor


    【解决方案1】:

    查看您的代码,我可以看到translateToEn 是由匿名用户调用的。如我错了请纠正我。

    如果是这种情况,我的建议是在客户端生成某种随机密钥,并使用该密钥附加您的数据。

    因此,在客户端上,您可以将令牌存储在 cookie 中。您可以使用 Meteor 的 Random 包生成随机密钥 var token = Random.id() 或者您也可以使用 Meteor.uuid()。您可以将 cookie 过期设置为 Session,这是默认检查此 Session only cookies with Javascript。

    最后你可以将translateToEn改为接受token参数,然后用这个token存储文档

    Meteor.methods({
      translateToEn: function(token){
        check(token, String);
    
        // 
        // do something and get result
        // 
    
        TransToEnF.insert({ ... , token: token});
    

    在发布函数中传递相同的令牌以获得过滤后的结果

     Meteor.publish("translateToEn", function(token) {
      check(token, String);
      // send only filtered results;
      return [ TransToEnF.find({token: token}), TransToEnT.find({token: token })]
    });
    

    如果用户已登录,则应在方法中检查userId,并应定义发布函数this.userId。对于会话,您可以使用附加到this.connection 的hashedToken。您需要为此使用 accounts-base 包。

    连接令牌可以使用

    var token = Accounts._getLoginToken(this.connection.id);
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 2013-03-30
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 2016-07-21
      • 2012-05-02
      • 2017-04-01
      相关资源
      最近更新 更多