首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript - await不等待

javascript - await不等待
EN

Stack Overflow用户
提问于 2021-07-03 22:55:06
回答 2查看 42关注 0票数 2

我正在使用Knex从数据库中执行一个简单的select查询。我在then函数中返回了一个值,并在异步调用之前添加了await。但是await不会等待,总是运行下一行未定义的值。

这是用户模型文件,带有查询结果的console.log,总是最后打印:

代码语言:javascript
复制
import knex from '../db/db.config.js';

const User = {};

User.findByNameAndPassword = (username, password) => {
  knex('user')
    .where({ name: username })
    .where({ password: password })
    .then(rows => {
      console.log(rows);
      return rows;
    })
    .catch((error) => {
      console.log(error);
    }) 
}

export default User;

这是控制器,这里的console.log总是首先打印的:

代码语言:javascript
复制
import User from '../models/user.js';

export const login = async (req, res) => {
  let name = req.body.name;
  let password = req.body.password;

  let user = await User.findByNameAndPassword(name, password)
    
  console.log('user', user);
}
EN

回答 2

Stack Overflow用户

发布于 2021-07-03 23:05:15

为了让await工作,您需要在返回promise或promise本身的函数上使用它。

要在此实例中执行此操作,请在User.findByNameAndPassword函数中将return放在knex('user')之前。

票数 1
EN

Stack Overflow用户

发布于 2021-07-03 23:05:37

那么根据您分享的代码,看起来findByNameAndPassword是一个同步函数。所以在控制器中等待不会有任何帮助。你可能想要更新你的findByNameAndPassword到一个异步的。像这样

代码语言:javascript
复制
import knex from '../db/db.config.js';

const User = {};

User.findByNameAndPassword = async (username, password) => {
    try {
        const rows = knex('user')
            .where({ name: username })
            .where({ password: password });
        console.log(rows);
        return rows;
    catch(err) {
        console.log(err);
    } 
}

export default User;

这应该就行了。我们在这段代码中所做的是,我们试图在try块中获取rows。如果失败,catch块将注册一个错误,并为我们记录该错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68237331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档