Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Sequelize findOrCreate()--.catch()块在无错误期间在spread()之后执行_Javascript_Node.js_Sequelize.js - Fatal编程技术网

Javascript Sequelize findOrCreate()--.catch()块在无错误期间在spread()之后执行

Javascript Sequelize findOrCreate()--.catch()块在无错误期间在spread()之后执行,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我的错误与此类似: 使用sequelize.js作为ORM处理程序。 queryCondition变量值:{where:{$or:[{username:user.username},{email:user.email}]},默认值:user} 问题:成功地将用户实例保存到数据库后,在调用findOrCreate后,按建议调用排列。调用spread中的函数块,然后立即调用.catch块。不知道为什么会这样。有人能帮忙吗 model.User.findOrCreate(queryCondition

我的错误与此类似:

使用sequelize.js作为ORM处理程序。
queryCondition变量值:{where:{$or:[{username:user.username},{email:user.email}]},默认值:user}

问题:成功地将用户实例保存到数据库后,在调用findOrCreate后,按建议调用排列。调用spread中的函数块,然后立即调用.catch块。不知道为什么会这样。有人能帮忙吗

 model.User.findOrCreate(queryCondition).spread(function(user, created){
    callback && callback(user, created);
 }).catch(function(error){
     callback && callback(null, null, error);
 });
如果它正在调用.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
} 
请阅读以下内容:

如果使用另一个注释,它将无法正常工作,因此我建议您检查表列中的null字段,而不是null字段,并将其与用户对象进行比较,以查看用户对象中是否缺少字段。 在阅读Bergi的评论后,我还建议您尝试这样做:

 model.User
   .findOrCreate(queryCondition)
   .then(
     function(result, isCreated){
       callback && callback(result, isCreated);
     },
     function(error) {
       callback && callback(null, null, error);
     });
callback(user, created);  =>  callback(null, user, created);

callback(null, null, error);  =>  callback(error);
对于spread方法,我认为它不会抛出异常以便于捕获,因此在这种情况下:

model.User
  .findOrCreate(queryCondition)
  .spread(function(result, isCreated){
    if(!result) {
      return callback && callback('Cannot create user');
    }
    callback && callback(null, result, isCreated);
  });
另一方面,通常在大多数软件包中,习惯于将错误作为回调的第一个参数返回。所以我只能猜测这个问题不会发生在您的代码示例中,而是发生在等待回调的外部某处

因此,请尝试如下修改回调:

 model.User
   .findOrCreate(queryCondition)
   .then(
     function(result, isCreated){
       callback && callback(result, isCreated);
     },
     function(error) {
       callback && callback(null, null, error);
     });
callback(user, created);  =>  callback(null, user, created);

callback(null, null, error);  =>  callback(error);
如果它正在调用.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
} 
请阅读以下内容:

如果使用另一个注释,它将无法正常工作,因此我建议您检查表列中的null字段,而不是null字段,并将其与用户对象进行比较,以查看用户对象中是否缺少字段。 在阅读Bergi的评论后,我还建议您尝试这样做:

 model.User
   .findOrCreate(queryCondition)
   .then(
     function(result, isCreated){
       callback && callback(result, isCreated);
     },
     function(error) {
       callback && callback(null, null, error);
     });
callback(user, created);  =>  callback(null, user, created);

callback(null, null, error);  =>  callback(error);
对于spread方法,我认为它不会抛出异常以便于捕获,因此在这种情况下:

model.User
  .findOrCreate(queryCondition)
  .spread(function(result, isCreated){
    if(!result) {
      return callback && callback('Cannot create user');
    }
    callback && callback(null, result, isCreated);
  });
另一方面,通常在大多数软件包中,习惯于将错误作为回调的第一个参数返回。所以我只能猜测这个问题不会发生在您的代码示例中,而是发生在等待回调的外部某处

因此,请尝试如下修改回调:

 model.User
   .findOrCreate(queryCondition)
   .then(
     function(result, isCreated){
       callback && callback(result, isCreated);
     },
     function(error) {
       callback && callback(null, null, error);
     });
callback(user, created);  =>  callback(null, user, created);

callback(null, null, error);  =>  callback(error);
找到了答案: Sequelize使用Bluebird.js作为它的promise库签出package.json文件。说明了建议在sequelize 3.0中使用的扩展方法,请参见。本文档中的一节说明spread调用所有。然后。。在被子底下。因此,以下更改使用Node.js解决了我的问题:

model.User.findOrCreatequeryCondition .all.thenfunctionresult已创建{ callback&&callbacknull,结果,已创建; }, 函数错误{ 回调&&callbackerror; };

正确解析的承诺不会落入错误块,实际的数据库错误会被捕获到错误块中。最后,对于那些认为错误是由回调参数引起的人,请注意,根据num8er下面的建议,我只是对回调参数进行了重新排序:希望这对其他人有所帮助。

找到了答案: Sequelize使用Bluebird.js作为它的promise库签出package.json文件。说明了建议在sequelize 3.0中使用的扩展方法,请参见。本文档中的一节说明spread调用所有。然后。。在被子底下。因此,以下更改使用Node.js解决了我的问题:

model.User.findOrCreatequeryCondition .all.thenfunctionresult已创建{ callback&&callbacknull,结果,已创建; }, 函数错误{ 回调&&callbackerror; };


正确解析的承诺不会落入错误块,实际的数据库错误会被捕获到错误块中。最后,对于那些认为错误是由回调参数引起的人,请注意,根据num8er下面的建议,我只是对回调参数进行了重新排序:希望这对其他人有所帮助。

您能在问题中输入queryCondition变量吗?{where:{$or:[{username:user.username},{email:user.email}]},默认值:user}听起来您的回调确实引发了异常。错误是什么?对于这样的情况,您需要使用而不是。然后…捕获…。或者,假设Sequelize使用Bluebird,看看哪一个使用了节点回调约定,而不是自定义参数顺序。没有错误。数据插入成功,但.catch块在问题中放入queryCondition变量后立即执行?{where:{$or:[{username:user.username},{email:user.email}]},默认值:user}听起来您的回调确实引发了异常。错误是什么?对于这样的情况,您需要使用而不是。然后…捕获…。或者,假设Sequelize使用Bluebird,那么看看哪一个使用了节点回调约定,而不是
您的自定义参数顺序。没有错误。数据插入成功,但.catch块在处理排序建议后立即执行。我一定要重构……我还添加了查询条件JSON变量。@jried我已经更新了答案,请检查表列中有关必填字段的约束,我可以猜到有些非空字段不在用户对象中。尝试了两件事:1。正在添加第三个参数。spreadfunctionerror,用户,已创建。。。然后打印变量内容:从spread返回的变量只有两个。2.删除了.catch语句,如果实际插入数据时出错,则会导致异常。实际上,findOrCreate成功插入数据,并且我重新获取了对象。。。出于某些原因。在成功解析后仍会立即调用catch。@jried我没有再次尝试更改排列参数。您可以在catch块中执行console.logerror吗?@jried我已更新了答案并添加了Bergi的建议,请尝试。感谢您的订购建议。我一定要重构……我还添加了查询条件JSON变量。@jried我已经更新了答案,请检查表列中有关必填字段的约束,我可以猜到有些非空字段不在用户对象中。尝试了两件事:1。正在添加第三个参数。spreadfunctionerror,用户,已创建。。。然后打印变量内容:从spread返回的变量只有两个。2.删除了.catch语句,如果实际插入数据时出错,则会导致异常。实际上,findOrCreate成功插入数据,并且我重新获取了对象。。。出于某些原因。在成功解析后仍会立即调用catch。@jried我没有再次尝试更改扩展参数,您可以在catch块中执行console.logerror吗?@jried我已更新了答案并添加了Bergi的建议,请尝试。您现在正在使用三个参数调用callback,而不是像你原来的问题中的两个。我的猜测是,这实际上解决了你的问题,而不是重写。好吧。在您的初始代码中,回调很可能抛出了@Bergi建议的异常,因为它认为发生了错误,这就是catch触发的原因我假设回调在err throw err或类似的情况下会触发。我根据num8er下面的建议切换了回调的参数顺序以匹配约定…切换参数不是我的错误的原因。您现在调用回调时使用了三个参数,而不是像你原来的问题中的两个。我的猜测是,这实际上解决了你的问题,而不是重写。好吧。在您的初始代码中,回调很可能抛出了@Bergi建议的异常,因为它认为发生了错误,这就是catch触发的原因,我假设如果err throw err或类似的东西,回调会触发。我根据num8er下面的建议切换回调的参数顺序以匹配约定…切换参数不是我的错误原因。