Javascript 如何等待sequelize执行findOne

Javascript 如何等待sequelize执行findOne,javascript,node.js,sequelize.js,Javascript,Node.js,Sequelize.js,我有一条使用Sequelize.js的路线 app.get('/api/users/:username', (req, res) => { const foundUser = getUserByUsername(req.params.username); console.log(`foundUser = ${foundUser}`); return res.send(foundUser); }); getUserByUsername函数如下所示 const getUserBy

我有一条使用Sequelize.js的路线

app.get('/api/users/:username', (req, res) => {
  const foundUser = getUserByUsername(req.params.username);
  console.log(`foundUser = ${foundUser}`);
  return res.send(foundUser);
});
getUserByUsername函数如下所示

const getUserByUsername = username => {
  Viewer.findOne({
    where: {username}
  }).then(response => {
    console.log(response.dataValues);//the object with the data I need
    return response.dataValues;
  });
};
我希望在我的路由中获得const foundUser中的对象,但似乎我需要等到findOne被执行,因为在我的控制台中,我可以看到foundUser的日志(当时未定义)在函数getUserByUsername之前被执行

foundUser = undefined
Executing (default): SELECT `id`, `username`, `instakluiten`, `role`, `createdAt`, `updatedAt` FROM `viewers` AS `viewer` WHERE `viewer`.`username` = 'instak' LIMIT 1;
{ id: 19,
  username: 'instak',
  instakluiten: 18550,
  role: 'moderators',
  createdAt: 2016-10-02T16:27:44.000Z,
  updatedAt: 2016-10-09T10:17:40.000Z }

如何确保在找到用户后,我的foundUser将使用数据进行更新?

您可以通过承诺或回调来避免这种情况

app.get('/api/users/:username', (req, res) => {
getUserByUsername(req.params.username, function(err, result){
const foundUser = result;
console.log(`foundUser = ${foundUser}`);
 res.send(foundUser); 
});

});



const getUserByUsername = function(username, callback) {
Viewer.findOne({
where: {username}
}).then(response => {
console.log(response.dataValues);//the object with the data I need
return callback(null, response.dataValues);
});
};
app.get('/api/users/:username', (req, res) => {
  getUserByUsername(req.params.username, function(err, foundUser) {
    if (!err) {
      console.log(`foundUser = ${foundUser}`);
      return res.send(foundUser);
    } else {
      res.send(err)
    }
  });
});



const getUserByUsername = (username, callback) => {
  Viewer.findOne({
    where: {
      username
    }
  }).then(response => {
    console.log(response.dataValues); //the object with the data I need
    return callback(null, response.dataValues);
  });
};

你可以通过承诺或回调来避免它

app.get('/api/users/:username', (req, res) => {
  getUserByUsername(req.params.username, function(err, foundUser) {
    if (!err) {
      console.log(`foundUser = ${foundUser}`);
      return res.send(foundUser);
    } else {
      res.send(err)
    }
  });
});



const getUserByUsername = (username, callback) => {
  Viewer.findOne({
    where: {
      username
    }
  }).then(response => {
    console.log(response.dataValues); //the object with the data I need
    return callback(null, response.dataValues);
  });
};

您必须返回Sequelize创建的承诺,然后等待它解决。因此,
getUserByUsername
变成:

const getUserByUsername = username => {
  return Viewer.findOne({
    where: {username}
  }).then(response => {
    console.log(response.dataValues);//the object with the data I need
    return response.dataValues;
  });
};
在路线上:

app.get('/api/users/:username', (req, res) => {
  getUserByUsername(req.params.username).then(foundUser => {
    res.send(foundUser);
  });
});

这是因为你需要遵守承诺链。如果忘记返回,函数将返回
undefined
end,即使承诺最终得到了解决,它所解决的值也永远不会回到链中。

您必须返回Sequelize创建的承诺,然后等待它得到解决。因此,
getUserByUsername
变成:

const getUserByUsername = username => {
  return Viewer.findOne({
    where: {username}
  }).then(response => {
    console.log(response.dataValues);//the object with the data I need
    return response.dataValues;
  });
};
在路线上:

app.get('/api/users/:username', (req, res) => {
  getUserByUsername(req.params.username).then(foundUser => {
    res.send(foundUser);
  });
});

这是因为你需要遵守承诺链。如果忘记返回,函数将返回
undefined
end即使承诺最终被解析,它解析的值也不会返回到链中。

您不能像这样返回结果,您需要在回调中编写代码,然后您将得到iTunes回调函数您不能像这样返回结果,您需要在回调中编写代码,之后您将得到无法工作的iTunes回调函数,then(在getUserByUsername之后)抛出一个TypeError
TypeError:Cannot read属性'then'of undefined
您是否像我上面写的那样返回了承诺?根据Sequelize文档和我自己的经验,
Model.findOne()
会返回一个承诺,所以如果你得到
undefined
,听起来好像你没有返回它。我实际上已经复制了你的代码并将我的代码放在了注释中,我现在再次尝试了同样的方法,结果成功了。。。但是,这是如何工作的呢?您返回response.dataValues,这不是承诺。。。还是这样?我的意思是,你能解释一下为什么我可以打电话。然后在getUserByUsername上?我会在答案中添加一些解释,因为我不确定评论中的600个字符是否足够好,我想我可能不会更好地解释它,因为它已经在互联网上的各种资源中解释过了。。。但是这里的关键概念是一种叫做承诺链的东西,通过返回一个承诺(看看我的例子中的getUserByUsername函数),您可以访问这个承诺中由承诺创建的值。请参阅此处的“新手错误5”:这不起作用,then(在getUserByUsername之后)抛出一个TypeError
TypeError:无法读取未定义的属性“then”
您是否像我上面写的那样返回了承诺?根据Sequelize文档和我自己的经验,
Model.findOne()
会返回一个承诺,所以如果你得到
undefined
,听起来好像你没有返回它。我实际上已经复制了你的代码并将我的代码放在了注释中,我现在再次尝试了同样的方法,结果成功了。。。但是,这是如何工作的呢?您返回response.dataValues,这不是承诺。。。还是这样?我的意思是,你能解释一下为什么我可以打电话。然后在getUserByUsername上?我会在答案中添加一些解释,因为我不确定评论中的600个字符是否足够好,我想我可能不会更好地解释它,因为它已经在互联网上的各种资源中解释过了。。。但是这里的关键概念是一种叫做承诺链的东西,通过返回一个承诺(看看我的例子中的getUserByUsername函数),您可以访问这个承诺中由承诺创建的值。请参见此处的“新手错误5”: