我正在尝试使用socketio在其原型上发送方法的对象。但是当socketio内部调用JSON.stringify时,这些方法会消失。我目前的想法真的很乏味,似乎不正确。我目前的解决方案如下。有没有更好的方法呢?
/* ServerSide */
// Constructor Function
function Cons() {
this.prop = 'property'
}
// Method on the prototype
Cons.prototype.func = function() {
console.log('called')
}
io.on('connection', socket => {
let obj = new Cons()
obj = putMethodsOnTheObject(obj)
obj = stringifyMethods(obj)
io.emit('randomEvent', obj)
}
function putMethodsOnTheObject(obj) {
for(let i in obj) {
if(!obj.hasOwnProperty(i)) {
obj[i] = obj[i];
}
}
return obj
}
function stringifyMethods(obj) {
// Possibly toString each function and do some parsing?
}
/* ClientSide */
socket.on('randomEvent', obj => {
obj = deStringifyMethods(obj)
console.log('obj: ', obj)
}
function deStringifyMethods(obj) {
// Possibly create a new function object for each func that was
// converted to a string? like new Function(...)
}
答案 0 :(得分:0)
看起来你没有阻止我的socket.io问题,实际上你似乎被javascript stringify问题阻止了:JSON.stringify
不包括函数stringify,它只是字符串化值成员。
我发现第三方lib可以帮助字符串化函数:https://www.npmjs.com/package/json-fn,使用相同的lib,服务器中的stringify
和客户端中的parse
。我还没有用过,试一试,我认为这可以解决你的问题。
e.g。在服务器端:
let jsonfn = require('json-fn')
let obj = new Cons()
obj = putMethodsOnTheObject(obj)
obj = jsonfn.stringify(obj)
io.emit('randomEvent', obj)
祝你好运