在没有错误的情况下,在spread()之后执行sequelize findOrCreate() - .catch()块

时间:2016-09-06 21:28:27

标签: javascript node.js sequelize.js

我的错误类似于此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);
 });

2 个答案:

答案 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

如果使用其他注释,它将无法正常工作,因此我建议您检查nullnot 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);