Nodejs中为什么通过JSON.stringify转化出来的字符串创建记录会出错,而直写入内容{ id: 5, title: 'Some Title 5', body: 'Some body 5' }可以正常?

Nodejs中为什么通过JSON.stringify转化出来的字符串创建记录会出错,而直写入内容{ id: 5, title: ‘Some Title 5’, body: ‘Some body 5’ }可以正常?

var FastLegSBase = require(‘FastLegS’);
var FastLegS = new FastLegSBase(‘mysql’);

var connectionParams = { user: ‘root’, password: ‘’, database: ‘warship’, host: ‘localhost’, port: 3306 }

FastLegS.connect(connectionParams);

var callback = function(err, results) { console.dir(err); console.dir(results); }

var PlayerTables = FastLegS.Base.extend({ tableName: ‘player’, primaryKey: ‘id’ });

var info = JSON.stringify(player.info); PlayerTables.create(info, callback);

为什么我通过JSON.stringify转化出来的字符串创建记录会出错,而直写入内容{ id: 5, title: ‘Some Title 5’, body: ‘Some body 5’ }可以正常。


9 回复

Node.js 中为什么通过 JSON.stringify 转化出来的字符串创建记录会出错?

在你的代码中,问题出在使用 JSON.stringify 转换后的字符串不能直接用于数据库插入操作。JSON.stringify 会将对象转换成一个 JSON 字符串,这种格式并不符合数据库插入的预期格式。

示例代码

假设你有一个 player 对象:

var player = {
    id: 5,
    title: 'Some Title 5',
    body: 'Some body 5'
};

直接写入内容 { id: 5, title: 'Some Title 5', body: 'Some body 5' } 是有效的,因为这是一个 JavaScript 对象,可以直接传递给数据库插入方法。

但是当你使用 JSON.stringify 将其转换为字符串后:

var info = JSON.stringify(player); // 输出: {"id":5,"title":"Some Title 5","body":"Some body 5"}

这样生成的字符串 info 是一个 JSON 格式的字符串,而不是一个 JavaScript 对象。如果你尝试将这个字符串直接传给数据库插入方法,可能会导致错误,因为数据库期望的是一个对象而不是一个字符串。

解决方案

你应该直接传递对象而不是字符串。例如:

var FastLegSBase = require('FastLegS');
var FastLegS = new FastLegSBase('mysql');

var connectionParams = {
    user: 'root', 
    password: '', 
    database: 'warship', 
    host: 'localhost', 
    port: 3306
};

FastLegS.connect(connectionParams);

var callback = function(err, results) {
    console.dir(err);
    console.dir(results);
};

var PlayerTables = FastLegS.Base.extend({
    tableName: 'player',
    primaryKey: 'id'
});

var player = {
    id: 5,
    title: 'Some Title 5',
    body: 'Some body 5'
};

// 直接传入对象
PlayerTables.create(player, callback);

这样,PlayerTables.create 方法就可以正确地处理对象并将其插入到数据库中。


通过JSON.stringify转化出来的字符串同{ id: 5, title: ‘Some Title 5’, body: ‘Some body 5’ }有什么区别?

干嘛要调用JSON.stringfy转换成字符串? 如果create的参数要的是JSON object, 你放一个string, 当然会出错.

出错?有提示信息么?

有错误提示,看不懂

E:\Server\node_modules\FastLegS\lib\utils.js:30
    return _.include(columns, field.split('.')[0]);
                                    ^
TypeError: Object 0 has no method 'split'
    at fieldIsValid (E:\Server\node_modules\FastLegS\lib\utils.js:30:37)
    at E:\Server\node_modules\FastLegS\lib\utils.js:92:16
    at Function._.each._.forEach (E:\Server\node_modules\FastLegS\node_modules\underscore\underscore.js:81:22)
    at _.(anonymous function) [as each] (E:\Server\node_modules\FastLegS\node_modules\underscore\underscore.js:1069:39)
    at validFields (E:\Server\node_modules\FastLegS\lib\utils.js:91:15)
    at E:\Server\node_modules\FastLegS\lib\adapters\mysql\statements.js:83:17
    at Array.map (native)
    at Function._.map._.collect (E:\Server\node_modules\FastLegS\node_modules\underscore\underscore.js:97:56)
    at buildInsertFields (E:\Server\node_modules\FastLegS\lib\adapters\mysql\statements.js:82:14)
    at Object.exports.insert (E:\Server\node_modules\FastLegS\lib\adapters\mysql\statements.js:36:16)

create的参数要的应该就是一个json string我试过输入字符串可以正常运行。

TypeError: Object 0 has no method ‘split’ 的意思是,__field__变量没有一个叫__split__的方法。 __split__只有字符串才有的,而此时的__field__是一个数值型。

这个错误有可能是__FastLegS__模块的Bug,也有可能是因为其他地方的输入不正确而引发的。

我看了一下__FastLegS__模块的使用方法,你的代码中PlayerTables.create(info, callback); __create()__的第一个参数应该是一个__Object__或者__Array__的,而此时你的__info__是一个字符串,并没有按照规定来调用。

参考:http://didit-tech.github.com/FastLegS/

在Node.js中,使用JSON.stringify将对象转换为JSON字符串后,该字符串是一个纯文本格式。当你尝试直接将这个字符串作为对象传递给create方法时,框架可能无法正确解析它。

正确的做法是先将对象转换成实际的对象形式,然后再进行数据库操作。在你的例子中,应该是将info变量直接设置为一个对象,而不是将其转换为字符串。

示例代码

var FastLegSBase = require('FastLegS');
var FastLegS = new FastLegSBase('mysql');

var connectionParams = {
    user: 'root', 
    password: '', 
    database: 'warship', 
    host: 'localhost', 
    port: 3306
};

FastLegS.connect(connectionParams);

var callback = function(err, results) {
    if (err) {
        console.error("Error:", err);
    } else {
        console.log("Results:", results);
    }
};

var PlayerTables = FastLegS.Base.extend({
    tableName: 'player',
    primaryKey: 'id'
});

// 直接使用对象,而不是转换后的字符串
var playerInfo = { id: 5, title: 'Some Title 5', body: 'Some body 5' };
PlayerTables.create(playerInfo, callback);

解释

  1. 直接传递对象:在调用PlayerTables.create()时,你应该直接传入一个JavaScript对象(如playerInfo),而不是先将对象转换为字符串再转换回来。

  2. 错误处理:确保你的回调函数中包含了错误处理逻辑,以便更好地调试问题。

通过这种方式,你可以确保数据库操作能正确地接收并处理对象数据。

回到顶部