【问题标题】:javascript - await doesn't waitjavascript - 等待不等待
【发布时间】:2021-09-15 02:59:56
【问题描述】:

我正在使用 Knex 从数据库中进行简单的选择查询。我在 then 函数中返回了一个值,并在异步调用之前添加了 await。但是 await 不会等待,而是始终以未定义的值继续运行下一行。

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

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总是先打印出来的:

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);
}

【问题讨论】:

  • 你没有从方法中返回 Promise,所以没有什么可以等待的。
  • @JaredSmith 我已经修复了这个错误,但我仍然很困惑。然后在 findByNameAndPassword 方法中,我返回行,如文档所述,这些行被转换为 Promise。但是为什么它不起作用。

标签: javascript node.js async-await


【解决方案1】:

嗯,根据你分享的代码,findByNameAndPassword 似乎是一个同步函数。所以等待对控制器没有帮助。您可能希望将您的 findByNameAndPassword 更新为 Async 。像这样

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 块将注册一个错误并为我们记录错误。

【讨论】:

    【解决方案2】:

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

    为此,请在您的 User.findByNameAndPassword 函数中将 return 放在 knex('user') 之前。

    【讨论】:

    • 非常感谢我解决了我的问题。但是当我读到时,如果我在 then 中使用 return,它会隐式地将返回的值包装在一个 Promise 中。所以 then 中的 return 语句将向控制器返回一个 Promise。但为什么这不起作用?
    • 你能帮我解决这个问题吗?我很困惑,因为正如文档所述,从那时起返回会返回一个承诺。
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 2018-12-09
    • 1970-01-01
    • 2019-10-21
    • 2018-05-04
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多