sailsjs“错误:将模型转换为对象时出错。

sailsjs 0.11,节点0.12.4。 护照0.2.1和护照本地1.0

使用sailsjs蓝图路线只是为了看看发生了什么。 该项目只是一个简单的博客,我试图看蓝图路由/user/4中的用户configuration文件来显示我的用户名为4.此消息是结果。

任何想法是什么造成这个?

注:我没有任何附近的帆/水线源。

完整的错误信息

 /home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/waterline/lib/waterline/model/lib/defaultMethods/toObject.js:59 throw err; ^ Error: There was an error turning the model into an object. at new module.exports (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/waterline/lib/waterline/model/lib/defaultMethods/toObject.js:56:15) at prototypeFns.toObject (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/waterline/lib/waterline/model/index.js:30:14) at prototypeFns.toJSON (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/waterline/lib/waterline/model/index.js:112:20) at Object.stringify (native) at ServerResponse.res.json (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/express/lib/response.js:217:19) at sendJSON (/home/vagrant/nodeprojs/<project>/api/responses/ok.js:34:23) at viewReady (/home/vagrant/nodeprojs/<project>/api/responses/ok.js:72:25) at viewFailedToRender (/home/vagrant/nodeprojs/<project>/node_modules/sails/lib/hooks/views/res.view.js:276:16) at Function.app.render (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/express/lib/application.js:514:14) at ServerResponse.res.render (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/express/lib/response.js:827:7) at ServerResponse.res.view (/home/vagrant/nodeprojs/<project>/node_modules/sails/lib/hooks/views/res.view.js:237:16) at Object.sendOK (/home/vagrant/nodeprojs/<project>/api/responses/ok.js:71:19) at ServerResponse.bound [as ok] (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/lodash/dist/lodash.js:729:21) at found (/home/vagrant/nodeprojs/<project>/node_modules/sails/lib/hooks/blueprints/actions/findOne.js:37:9) at wrapper (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/waterline/node_modules/lodash/index.js:3602:19) at applyInOriginalCtx (/home/vagrant/nodeprojs/<project>/node_modules/sails/node_modules/waterline/lib/waterline/utils/normalize.js:421:80) 

和User.js模型。 toJSON被注释掉,因为该消息最初指向该部分。 在注释掉之后,第3行( at User.attributes.toJSON )现在是不同的。

 var bcrypt = require ('bcrypt') var User = { attributes: { email: { type: 'email', required: true, unique: true }, password: { type: 'string', minLength: 6, required: true }, admin: { type: 'boolean', defaultsTo: false // separate from acl }, acl: { type: 'string', defaultsTo: 'USER' // MOD, USER (unlogged should get GUEST) } /* toJSON: function() { var obj = this.toObject(); delete obj.password; return obj; } */ }, beforeCreate: function(user, cb) { bcrypt.genSalt(10, function(err, salt) { bcrypt.hash(user.password, salt, function(err, hash) { if (err) { console.log(err); cb(err); } else { user.password = hash; cb(); } }); }); } }; module.exports = User; 

[$ E]经过进一步的审查,我做了一个对象到string的转换,并在几个点输出它。 try语句的第一行上的对象,和concurrentstn catch语句的第一行是这样的:

  waterline:toObject > this.object TRY= >>> email: admin@admin.com password: $2a$10$bNktAvahfa3f8Q8lTV262u9RrLUqdvp7SzfM6dQqki3YliXdLMWxK admin: true acl: USER createdAt: Fri May 29 2015 23:25:35 GMT+0000 (UTC) updatedAt: Fri May 29 2015 23:25:35 GMT+0000 (UTC) id: 1 _locals: [object Object] <<< +2ms waterline:toObject > this.object CATCH= >>> email: admin@admin.com password: $2a$10$bNktAvahfa3f8Q8lTV262u9RrLUqdvp7SzfM6dQqki3YliXdLMWxK admin: true acl: USER createdAt: Fri May 29 2015 23:25:35 GMT+0000 (UTC) updatedAt: Fri May 29 2015 23:25:35 GMT+0000 (UTC) id: 1 _locals: [object Object] <<< 

(这个输出不应该是JSON,它只是一个转储)

除非有人有更好的主意,否则我想我会继续讨论sailsjs问题跟踪器。

我遇到了这个问题,经过了大量的麻烦,我终于解决了这个问题(我认为现在我花了很长的时间来修复这个bug,因为它是在开始构build应用程序的时候…)

没有看到你的控制器代码,我不知道这是否会为你解决,但对我来说,在将用户模型提供给部分时, toJSON的问题似乎发生。 我发现在将模型传递给渲染函数之前,将模型显式渲染为JSON会解决问题。

换句话说,我改变了这个:

 res.render('partials/user-card', user, function(err, html){ partialData = user.toJSON(); partialData.html = html; // Send out a message (with HTML fragment) to socket subscribers User.publishUpdate(user.id, partialData); }); 

对此:

 partialData = user.toJSON(); res.render('partials/user-card', partialData, function(err, html){ partialData.html = html; // Send out a message (with HTML fragment) to socket subscribers User.publishUpdate(user.id, partialData); }); 

(即将user.toJSON移出render函数的callback,并将JSON而不是模型自身送入render函数)。 这允许我保留密码清除toJSON方法。