gpt4 book ai didi

angularjs - 如何从包装在函数中的 sequelize 查询返回结果

转载 作者:行者123 更新时间:2023-11-29 13:51:14 25 4
gpt4 key购买 nike

我正在构建一个为用户创建唯一 url 的服务。它应该执行以下操作:

  • query database to see if the user already has the url and send it back
  • if user doesn't have the url create one using the user's first and last name
  • check the database if somebody else is using that combination of string and attach a 1, 2, or 3 depending on how many other users have the name (ie. JackBlack1, JackBlack2, etc.).

    I have one get route set up that checks for the url, if the user doesn't have one yet I want to send the result of a separate function call (for the sake of keeping the code modular). My problem is with the function. It does not return the url string. I am trying to save the url string to a variable that is initiated at the top of the function but it's not being saved from the sequelize query. Here is the route where I call the function:

router.get('/link', function(req, res) {

db.user.find({where: {id: req.user.id} })

.then(function(user){

if (!user.addresslink) {
res.send(createUserLink(req.user.id,req.user.firstName,req.user.lastName));
} else {

res.send(user.addresslink)

}
})
.catch(function(err){
console.log(err);
res.status(500).send('Internal database error.');
})
})

这是 createUserLink 函数:

function createUserLink(userId, first, last){
var urlString = (first + last).toLowerCase();
var userLink;
var count;

db.user.findAndCountAll({where: { addresslink: { $like: 'www.website.com/' + urlString } }
}).then(function(result){

if(result.count > 0) {
count = result.count + 1;
db.user.find({where: {id: userId} }).then(function(user){
user.updateAttributes({
addresslink: 'www.website.com/' + urlString + count
}).then(function(result){

userLink = result.addresslink

return userLink;
})

})

} else {
db.user.find({where: {id: userId} }).then(function(user){
user.updateAttributes({
addresslink: 'www.website.com/' + urlString
}).then(function(result){

userLink = result.addresslink

return userLink;
})
})
}
})
return userLink ;
}

我假设无法从函数返回创建的 url 与查询的异步性质有关。是否需要在创建url后添加查询然后返回?这是我在这里的第一个问题,所以如果有任何不当之处,我提前道歉。

最佳答案

如果你想返回你的 createUserLink() 返回的值,你需要返回实际的 promise 并附加一个 .then() 来访问返回值(value)。

目前,您正在尝试访问返回的 userLink,就好像它是一个同步函数,函数本身将返回一个值。下面的示例不向客户端返回任何内容,因为 createUserLink() 立即返回 userLink,这将是未定义的。

res.send(createUserLink(req.user.id,req.user.firstName,req.user.lastName));

在处理 promise 时,情况并非如此。相反,promise 会立即以挂起状态返回,需要等待直到状态完成或被拒绝。当 promise 完成执行后,您可以访问链式 .then()

中的任何返回值

路线

在路由中,如果 user.addressLinkfalsy 那么我们要返回 Promise 返回函数 createUserLink(),否则返回user.addressLink。当从 then() 中返回一个值时,该值返回给我们包装在一个已完成的 Promise 中,然后调用下一个 then() 或将值本身返回到最接近的链中的 promise 。

router.get('/link', function(req, res) {

return db.user.find({where: {id: req.user.id} })
.then(function(user){
if (!user.addresslink)
return createUserLink(req.user.id,req.user.firstName,req.user.lastName);
else
return user.addressLink;
})
.then((userLink) => {
return res.send(userLink);
})
.catch(function(err){
console.log(err);
return res.status(500).send('Internal database error.');
})
})

创建用户链接

function createUserLink(userId, first, last){
var urlString = (first + last).toLowerCase();
var userLink;
var count;

return db.user.findAndCountAll({where: { addresslink: { $like: 'www.website.com/' + urlString } }})
.then(function(result){
if(result.count > 0)
count = result.count + 1;

return db.user.find({where: {id: userId} });
})
.then(function (user) {
let addressLink = 'www.website.com/' + urlString;

if (count > 0)
addressLink + count;

return user.updateAttributes({ addresslink : addressLink });
})
.then(function(result){
userLink = result.addresslink

return userLink;
})
}

有关 promise 的更多信息,promisejs.org是学习 promises 如何工作的重要资源。如果您想了解有关 promise 的更多信息,我推荐它。

关于angularjs - 如何从包装在函数中的 sequelize 查询返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40872285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com