我正在使用Knex从数据库中执行一个简单的select查询。我在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);
}发布于 2021-07-03 23:05:15
为了让await工作,您需要在返回promise或promise本身的函数上使用它。
要在此实例中执行此操作,请在User.findByNameAndPassword函数中将return放在knex('user')之前。
发布于 2021-07-03 23:05:37
那么根据您分享的代码,看起来findByNameAndPassword是一个同步函数。所以在控制器中等待不会有任何帮助。你可能想要更新你的findByNameAndPassword到一个异步的。像这样
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块将注册一个错误,并为我们记录该错误。
https://stackoverflow.com/questions/68237331
复制相似问题