Javascript Sequelize findOrCreate()--.catch()块在无错误期间在spread()之后执行
我的错误与此类似: 使用sequelize.js作为ORM处理程序。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
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下面的建议切换回调的参数顺序以匹配约定…切换参数不是我的错误原因。