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’ }可以正常。
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__是一个字符串,并没有按照规定来调用。