socket.io / Parameter in Verbindung
In meinem node.js /Express.js app, muss ich Parameter übergeben, mit dem sockel.io-Verbindung (habe das in einem anderen post).
Auf der client-Seite, ich habe so etwas wie :
Bearbeiten
var socket = io.connect('/image/change', {query:"name=my_img_name"});
var siofu = new SocketIOFileUpload(socket);
siofu.listenOnInput(document.getElementById("change_image_inpt"));
Auf der server-Seite :
Bearbeiten
io.of('/image/change')
.on('connection', function (socket) {
console.log('log input param : ' + socket.handshake.query.name);
});
Aber nichts in der Konsole.
Gibt es eine andere Möglichkeit das zu erreichen ?
edit2
Dies ist der vollständige code für den client :
$(document).ready(function() {
//icon_action_modal
$('.icon_actions').on('click', function() {
//set icon preview
$('#icon_action_modal_icon_preview').html('<img src="/upload/icon/' + $(this).data('icon') + '.png" />');
//set icon to delete
$('#icon_name').val($(this).data('icon'));
//set Change icon socket
var socket = io.connect('/icon_sets/change', {query:"name=my_img_name"});
var siofu = new SocketIOFileUpload(socket);
siofu.listenOnInput(document.getElementById("change_icon"));
//Do something when a file is uploaded
siofu.addEventListener("complete", function () {
$('.overlay').hide();
});
//display loader window
socket.on('displayOverlay', displayOverlay);
//display
socket.on('displayIconImage', function (data) {
$('#iconset_render').append('<div class="icon"><img src="' + data.path + '" /></div>');
});
socket.on('setIconsetArray', function (data) {
var iconset = ($('#iconset_array').val()) ? JSON.parse($('#iconset_array').val()) : [];
iconset.push(data.iconName);
$('#iconset_array').val(JSON.stringify(iconset));
deleteIcon($('#icon_name').val());
//close modal
$('#icon_action_modal').modal('hide');
});
});
$('#icon_action_modal_delete_icon').on('click', function() {
deleteIcon($('#icon_name').val());
//close modal
$('#icon_action_modal').modal('hide');
});
}); //end document.ready
Und der vollständige code für die server-Seite :
io.of('/icon_sets/change')
.on('connection', function (socket) {
console.log('log input param : ' + socket.handshake.query.name);
functions.socketImageTransfer(socket, 'icon', 65, 65);
});
Mit der socketImageTransfer
Funktion :
module.exports.socketImageTransfer = function(socket, type, width, height, name) {
var socketioFileUploadServer = require('socketio-file-upload'); //upload files by socket
var config = require(__dirname + '/config/config.json');
var easyimg = require('easyimage'); //crop - resize image
var fs = require('fs'); //file system access
//Make an instance of socketioFileUploadServer and listen on this socket:
var uploader = new socketioFileUploadServer();
uploader.dir = config.tmpDir;
uploader.listen(socket);
//Do something when a file is saved:
uploader.on('saved', function (event) {
console.log('Original ' + type + ' saved');
//resize and rename image with a unique id
var newName;
if (!name) {
newName = Math.random().toString(36).substr(2, 9) + '_' + type + '.png';
} else {
newName = name;
}
var fileName = event.file.name.replace(//g, '_');
easyimg.rescrop({src: config.tmpDir + fileName, dst: config.uploadDir + type + '/' + newName, width: width, height: height}, function (err, image) {
if (err) return console.log(err);
console.log(type + ' resized and cropped: ' + image.width + ' x ' + image.height);
//image is uploaded - resized - croped, now display it
socket.emit('display' + ucfirst(type) + 'Image', {path: '/upload/'+ type + '/' + newName});
//remove original from file system
fs.unlink(config.tmpDir + fileName, function () {
if (err) throw err;
console.log('Original ' + type + ' removed');
});
//additionnal action
switch(type) {
case 'icon':
//send path to generate iconset_json
socket.emit('setIconsetArray', {iconName: newName});
break;
}
});
});
uploader.on('start', function (event) {
console.log('Client start upload');
socket.emit('displayOverlay');
});
//Error handler:
uploader.on('error', function (event) {
console.log("Error from uploader", event);
});
};
Schätzen Ihre Hilfe
- Wenn es nichts in der Konsole, Ihre
connection
handler nicht ausgelöst, weil mindestensundefined
sollte in der Konsole. Wahrscheinlich haben Sie einen Fehler in einem anderen Ort zusammen mit einem Fehler, die ich beschrieben habe in meiner Antwort. - Dein code scheint zu funktionieren, außer eine Sache: Sie erklären
socket
, aber passsocket2
zuSocketIOFileUpload
Konstruktor. - Ja, sorry, In meinem code der name der socket ist " socket2. Aber wie ich schon sagte in Ihrer Antwort, dieser code wird ausgeführt, BEVOR ich das will ... es ist ausgeführt, wenn ich den server starten. Und zu dieser Zeit werden die client-Datei, die Inhalte der socket-code ist ja nicht enthalten...
- Ich glaube, dass es ausgeführt wird, auf dem server zu starten, weil Sie einen geöffneten Seite in Ihrem browser und Steckdose.IO versucht, Verbindung jede
n
Sekunden. Wenn der server gestartet, wieder wird erfolgreich und Ihreconnection
- handler feuert (die in der Regel ausgelöst, wenn die Verbindung zwischen client und server erfolgreich hergestellt). Es ist merkwürdig, dassconsole.log
Ausgängeunderfined
. Ich versuchte Ihren code, und für mich funktioniert gut mit Buchse.IO 0.9 und 1.0. Können Sie zeigen Sie Ihre vollständigen code, da ich denke, dass das problem an anderer Stelle. - Haben Sie versucht, mit sockel.io Datei-upload-Modul ? Vielleicht ist das problem mit diesem Paket ... ich benutze Buchse.io 0.9. Bitte, sehen Sie die post-update. Ich habe den full client - server-code. Ich habe nicht Hinzugefügt, den HTML-Teil. Es ist einfach ein modales Fenster geöffnet mit einem Klick auf ein Bild, das Sie ändern möchten.
<a title="Icon Actions" class="icon_actions" data-toggle="modal" href="#icon_action_modal" data-icon="<%= icon %>">
. TY für Eure Hilfe - Seltsam :/ dieser code funktioniert für mich. Ich kann sehen
log input param : my_img_name
in meiner Konsole. Werfen Sie einen Blick auf meine server-side-code bei Pastebin. Wahrscheinlich dieser code unterscheidet sich von Ihnen. - Durch die Art und Weise, wie Sie dienen
/siofu/client.js
- Datei? - Es ist nur ein EJS Skript in mein layout aus dem Blick.
<% script('/siofu/client.js') %>
diese Skripts enthalten sind, bevor die</body>
schließen-tag. Ich erstellt eine Pastebin post-zeigen Sie die komplette server-Seite. Ty für Ihre Zeit & Ihr helfen - Ich bearbeitet meine Antwort. Siehe änderungen unten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, gibt es.
1)
query
ist wieGET
Parameter, so ersetzen"param:value"
mit"param=value"
(wenn Sie mehrere Parameter übergeben, tun Sie es, wie Sie normalerweise tun mit der URL:param=value&some_other_param=test
)2) Es ist ein einfacher und zuverlässiger (weil es kein Risiko für den Zugriff auf eine Undefinierte Eigenschaft von
handshaken
Objekts) Weg, um query-parameter innerhalbconnection
handler:Edit:
Nach lernen Sie Ihre vollständigen code, ich denke, ich habe herausgefunden, was das problem verursacht. Das problem ist, dass Sie wahrscheinlich falsch verstanden, die Haupt-Idee des Sockels.IO namespaces.
Ich vermute, Sie haben mehrere Sockel.IO-verbindungen (
io.connect
Anrufe) innerhalb einer Seite, richtig? In der Regel eine einzelne Verbindung ist genug. Dein Fehler ist, dass Sie anrufenio.connect
auf Maus-Ereignis, aber Sie sollten Sie nennen, einmal aufdocument.ready
, und dann nuremit
ting.Werfen Sie einen Blick auf den folgenden code (client-Seite):
Server-side-code:
Wenn Sie einen namespace, sollte es funktionieren. Ich weiß nicht wirklich, ob es ein Fehler des Sockels.IO oder unsachgemäße Verwendung der namespaces, aber ändern von code, um nur ein Namensraum (namespace) sollte den trick tun.
Also in deinem Fall Sie nicht haben, um passieren query-Parameter beim Händeschütteln an alle.Eigentlich haben Sie mit dem Abfrage-parameter, wenn Sie möchten, dass Ihre app mehr sicher. Sehen http://wlkns.co/node-js/socket-io-authentication-tutorial-server-and-client/ (für die Steckdose.io 0.9)Hoffe, meine Antwort hilft dir. Viel Glück!
log input param : undefined
aber zu dieser Zeit, ich habe Sie nicht laden Sie ein neues Bild ... Bitte, siehe mein post-update. Ty im Voraus für Eure Hilfequery
parameter hat nicht funktioniert. Ich werde in diese Richtung gehen. TY CuriousGuy !{query: 'param1=something¶m2=another'}
? Sie können pass-params der gleichen Weise, wie Sie es mit URL-GET-Parameter, d.h. mit&
als Trennzeichenconsole.log(socket.handshake.query.name);
aber ich verstehe nicht, wo istsocket
zuvor definierten...socket
ist ein'connection'
- handler-Funktion, argument. bearbeitet meine Antwort. danke 🙂uploader.listenOnInput(document.getElementById("siofu_input"));
server-side bin nicht sicher, wie man Ihren Wert, die obige Antwort hat mir nicht geholfen.Hier ist, was ich getan habe.
Client
Server