不知道这样问是不是正确。
先上代码
user.js
var baseDao = require('../dao/baseDao');
function User(user) {
this.ID = user.ID || null;
this.CODE = user.CODE || null;
this.NAME = user.NAME || null;
}
User.prototype = baseDao;
User.prototype.table_name = 'user';
module.exports = User;
baseDao.js
// Sql builder
var squel = require('squel');
// DB ThreadPool
var pool = require('../tool/DB');
// 错误用法
// function save(callback) {
// var ob = this;
function save(ob, callback) {
var sql = squel.insert()
.into(table_name)
.setFields(ob)
.toString();
pool.getConnection(function (err, conn) {
if (err) {
return callback(err);
}
conn.query(sql, function (err) {
conn.release();
if (err) {
return callback(err);
}
callback(null)
});
});
}
...
route.js
...
var User = require('../src/user');
...
router.post('/profile', function (req, res, next) {
var user = JSON.parse(req.body.user);
// save
var _user = new User(user);
_user.save(user, function (err) {
...
})
});
调用关系 router.js
-> user.js
-> baseDao.js
squel.js
是封装mysql
驱动的模块。
问题出在 .setFields(ob)
这个地方,错误信息
Error: field value must be a string, number, boolean, null or one of the registered custom value types
官方文档给出的用法如下:
squel.insert()
.into("students")
.setFields({ name: "Thomas", age: 29 })
.toString()
我觉得我的调用没有问题
两种调用方式在 baseDao.js
的save 中方法中使用 JSON.stringify()
打印出的对象是完全一致的。
但是直接使用(注释掉的部分是报错的情况)this会报错, 直接传ob对象不会报错。
一定是哪里用错了,恳请指正!
自己来答一下,原因在
.setFields
方法遍历了传入的属性,由于原型链的作用,一些不相关的属性也遍历出来了,比如 baseDao.save 方法,JSON.stringify 只能检测两个对象本身,原型链上的引用是不考虑的。姑且使用的时候用JSON.stringify之后再parse回来的方法解决一下