2017-12-21 3 views
0

Ich arbeite an meiner Domain-generierenden App, die Domain-Namen in verschiedenen Sprachen bietet.Meteor mongo sessions

ist es möglich, eine Mongo-Sammlung in Benutzersitzungen zu speichern? So konnte jeder Benutzer verschiedene Sammlungsergebnisse sehen. Ich habe einen API-Aufruf Server-Seite, die Daten in Mongo Sammlung geht:

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({}); 
})); 
}}); 

ich diese Methode von der Client-Seite bin Aufruf einreichen Ereignis wie folgt aus:

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(); 
    }, 

und Druckdaten Helfer mit:

leider, wenn es mehr als 1 Benutzer gibt, sehen sie alle die gleichen Ergebnisse, Seite wird sofort neu geladen, nachdem einer von ihnen das Textfeld übermittelt. Haben Sie irgendwelche Lösungen, um dieses Problem zu lösen?

Antwort

0

Mit Blick auf Ihren Code konnte ich sehen, dass die translateToEn von anonymen Benutzern aufgerufen wird. Korrigiere mich, wenn ich falsch liege.

Wenn das der Fall ist, was ich vorschlagen würde ist, eine Art zufälliger Schlüssel auf dem Client zu generieren und Ihre Daten mit diesem Schlüssel anzuhängen.

So auf dem Client können Sie ein Token in Cookie speichern. Sie können Meteor Random-Paket verwenden, um zufällige Schlüssel var token = Random.id() zu generieren, oder Sie können auch Meteor.uuid() verwenden. Sie können den Cookie-Ablauf als Session festlegen. Dies ist der Standardwert, der auf Session only cookies with Javascript überprüft wird.

Schließlich können Sie translateToEn ändern token Parameter und dann Speichern von Dokumenten mit diesem Token

Meteor.methods({ 
    translateToEn: function(token){ 
    check(token, String); 

    // 
    // do something and get result 
    // 

    TransToEnF.insert({ ... , token: token}); 

passieren die gleiche Token in einer veröffentlichen Funktion zu akzeptieren, um das gefilterte Ergebnis

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

Wenn der Benutzer zu erhalten Wenn Sie eingeloggt sind, sollten Sie nach userId in der Methode suchen und die Veröffentlichungsfunktion this.userId sollte definiert werden. Für die Sitzung können Sie die hashedToken verwenden, die an die this.connection angeschlossen ist. Sie müssen accounts-base Paket dafür verwenden.

Das Token für den Anschluss kann dieser

hilft

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

Hoffnung mit abgerufen werden