我的错误类似于此post:
使用sequelize.js作为ORM处理程序。 queryCondition变量值:{where:{$或:[{username:user.username},{email:user.email}]},默认值:user}
问题:成功将用户实例保存到数据库后,调用spread()
后会按照建议调用findOrCreate()
。调用spread()
中的功能块,然后在调用.catch()
块后立即调用。不知道为什么会这样。有人可以帮忙吗?
model.User.findOrCreate(queryCondition).spread(function(user, created){
callback && callback(user, created);
}).catch(function(error){
callback && callback(null, null, error);
});
答案 0 :(得分:2)
找到答案: Sequelize使用Bluebird.js作为它的promise库(查看package.json文件)。 documentation解释了spread()方法,建议在sequelize 3.0中使用(参见post)。本文档中的一节说明spread()调用all()。then(..)。因此,以下更改使用Node.js解决了我的问题:
model.User.findOrCreate(queryCondition)
.all().then(function(result, isCreated){
callback && callback(null, result, isCreated);
},
function(error) {
callback && callback(error);
});
正确解析的promise不会出现在错误块中,并且错误块中会捕获实际的数据库错误。最后,对于那些假设错误是由回调参数引起的人,请注意我只是根据下面给出的num8er建议重新排序了回调参数。 :)希望这有助于其他人。
答案 1 :(得分:1)
如果它正在调用.catch
块,那么它似乎有一些问题。
尝试调试它并查看原因:
model.User.findOrCreate(queryCondition).spread(function(user, created){
callback && callback(user, created);
}).catch(function(error){
console.error(queryCondition, error); // add this and check the output
callback && callback(null, null, error);
});
我也看到你的queryCondition变量也没问题。
{
where:{$or: [{username:user.username},{email:user.email}]},
defaults:user
}
所以让我们试试这个注释:
{
where:{$or: [{username: {$eq: user.username}},{email: {$eq: user.email}}]},
defaults:user
}
请阅读:http://docs.sequelizejs.com/en/latest/docs/querying/#where
如果使用其他注释,它将无法正常工作,因此我建议您检查null
,not null
字段的表格列,并将其与user
对象进行比较,看看是否存在在user
对象中缺少字段。
在阅读了Bergi的评论之后,我还建议你尝试这样做:
model.User
.findOrCreate(queryCondition)
.then(
function(result, isCreated){
callback && callback(result, isCreated);
},
function(error) {
callback && callback(null, null, error);
});
在spread
方法的情况下,我认为它不会引发异常以便被捕获,所以在这种情况下:
model.User
.findOrCreate(queryCondition)
.spread(function(result, isCreated){
if(!result) {
return callback && callback('Cannot create user');
}
callback && callback(null, result, isCreated);
});
P.S。通常在大多数包中,将错误作为回调的第一个参数返回。所以我只能猜测问题发生在你的代码示例中,它发生在等待回调的外面。
所以尝试修改这样的回调:
callback(user, created); => callback(null, user, created);
callback(null, null, error); => callback(error);