【发布时间】:2014-09-24 20:29:44
【问题描述】:
在我的 node.js / Express.js 应用程序中,我需要通过 socket.io 连接传递参数(在另一篇文章中看到)。
在客户端,我有类似的东西:
编辑
var socket = io.connect('/image/change', {query:"name=my_img_name"});
var siofu = new SocketIOFileUpload(socket);
siofu.listenOnInput(document.getElementById("change_image_inpt"));
在服务器端:
编辑
io.of('/image/change')
.on('connection', function (socket) {
console.log('log input param : ' + socket.handshake.query.name);
});
但控制台中什么也没有。
还有其他方法可以实现吗?
edit2
这是客户端的完整代码:
$(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
以及服务器端的完整代码:
io.of('/icon_sets/change')
.on('connection', function (socket) {
console.log('log input param : ' + socket.handshake.query.name);
functions.socketImageTransfer(socket, 'icon', 65, 65);
});
使用socketImageTransfer 功能:
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);
});
};
感谢您的帮助
【问题讨论】:
-
如果控制台中没有任何内容,您的
connection处理程序根本不会触发,因为至少undefined应该在控制台中。可能您在其他地方有错误以及我在回答中描述的错误。 -
您的代码似乎在工作,除了一件事:您声明
socket,但将socket2传递给SocketIOFileUpload构造函数。 -
是的,对不起,在我的代码中,套接字的真实名称是`socket2。但正如我在你的回答中所说,这段代码是在我想要之前执行的......它是在我启动服务器时执行的。而此时,包含socket代码的客户端文件并没有被包含...
-
我相信它是在服务器启动时执行的,因为您的浏览器中有一个打开的页面,并且 Socket.IO 尝试重新连接每个
n秒。当服务器启动时,重新连接成功并且您的connection处理程序触发(通常在客户端和服务器之间的连接成功建立时触发)。奇怪的是console.log输出underfined。我尝试了您的代码,对我来说,Socket.IO 0.9 和 1.0 都可以正常工作。你能展示你的完整代码吗,因为我认为问题出在其他地方。 -
你试过socket.io文件上传模块了吗?也许问题出在这个包上……我使用的是 socket.io 0.9。请看帖子更新。我添加了完整的客户端 - 服务器代码。我没有添加 HTML 部分。它只是通过单击要更改的图像打开的模式窗口。
<a title="Icon Actions" class="icon_actions" data-toggle="modal" href="#icon_action_modal" data-icon="<%= icon %>">。 TY 为您提供帮助
标签: javascript node.js express socket.io