MySql:String成为一个对象?奇怪的行为

时间:2013-09-05 20:14:13

标签: javascript mysql json node.js

任何人都可以解释为什么我放在MySql数据库中的字符串变成了一个不可用的对象?我该如何解决?

注意:我正在使用Nodejs。表项是(id = VARCHAR和data = BLOB)

JSONf与JSON相似,但它也可以用于函数。

item = {"id":"myitem",
        "option":[  (function(key){ craftItem(key,{"piece":"armor"},{"item":[]});}),
                    (function(key){ test2(key);})
        ]};

str = JSONf.stringify(item); //str = {"id":"myitem","option":["function (key){ craftItem(key,{\"piece\":\"armor\"},{\"item\":[]});}","function (key){ test2(key);}"]}
console.log(typeof str);    //string
obj = JSONf.parse(str);
obj.option[1]();    //calling the method as expected

//Note: data is blob type in MySql
client.query("INSERT INTO item(id,data) VALUES ('" + item.id + "','" +     JSONf.stringify(item) + "')",
function(err, results) {    if(err) throw err 
    client.query("SELECT * FROM item WHERE id='" + item.id + "'" ,function(err,     results) {
        str = results[0].data;
        console.log(str);   //<Buffer 7b 22 69 64 22 3a 22 6d 79 69 74 65 6d 22 2c 22 6f 70 74 69 6f 6e 22 3a 5b 22 66 75 6e...
        console.log(typeof str);    //Object?...

        obj = JSONf.parse(str); //ERROR: Unexpected token p
        //Note: p is probably from the ' craftItem(key,{\"piece\":\"armor\"} '
        obj.option[1](); //never called because program crashed...

});

});

JSONf.stringify = function(obj) {
return JSON.stringify(obj,function(key, value){
    return (typeof value === 'function' ) ? value.toString() : value;
});
}

JSONf.parse = function(str) {
return JSON.parse(str,function(key, value){
    if(typeof value != 'string') return value;
    return ( value.substring(0,8) == 'function') ? eval('('+value+')') : value;
});
}

2 个答案:

答案 0 :(得分:1)

保存到blob字段,这只是一个字节集合。在节点中,这表示为缓冲对象。您可能想要做的是将字段的mysql数据类型从BLOB更改为TEXT,这样就可以对数据进行字符编码。这样返回的对象应该是一个可以解析的字符串。

在相关说明中,您确定要将数据序列化到数据库中。这种方式首先打败了使用数据库的目的,因为您无法有效地对序列化数据进行索引/排序等。

编辑:

另请注意,如果在节点文档中查找缓冲区对象,则无法将对象转换回字符串对象。但是,如果您存储文本而非二进制数据(如图像),则最好使用TEXT

答案 1 :(得分:1)

如果您不想将模式更改为按驱动程序序列化为字符串的类型(这是基于字段类型,如TEXT与BLOB和字符集 - 如果它是“二进制”,则使用缓冲区)然后你可以将结果转换为字符串:

str = results[0].data.toString(); // array of bytes interpreted as utf8 sequence and converted to JS string

此外,您手动将数据与查询连接在一起。您需要添加转义(connection.escape())或更好地使用内置参数化支持:

而不是

client.query("SELECT * FROM item WHERE id='" + item.id + "'" ,function(err, res) {
   ///
});

你应该做

client.query("SELECT * FROM item WHERE id=?", [item.id] ,function(err, res) {
   ///
});

client.execute("SELECT * FROM item WHERE id=?", [item.id] ,function(err, res) {
   ///
});

如果您想使用预准备语句(node-mysql2支持)