Estoy usando Knex para hacer una consulta de selección simple de la base de datos. Devolví un valor en la función y agregué esperar antes de la llamada asíncrona. Pero await no espera y siempre sigue ejecutando la siguiente línea con un valor indefinido.
Este es el archivo de modelo de usuario con console.log para el resultado de la consulta, esto siempre se imprime en último lugar:
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;y este es el controlador, el archivo console.log aquí siempre se imprime primero:
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); }Para que await funcione, debe usarlo en una función que devuelva una promesa, o una promesa en sí misma.
Para hacerlo en este caso, coloque return antes knex('user') en su función User.findByNameAndPassword .
Bueno, según el código compartido por usted, parece que findByNameAndPassword es una función síncrona. Entonces, esperar no ayudará en el controlador. Es posible que desee actualizar su findByNameAndPassword a uno asíncrono. Como esto
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; Deberias hacer eso. Lo que estamos haciendo en este código es intentar obtener las rows en el bloque de prueba. Y si FALLA, el bloque catch registrará un error y registrará el error por nosotros.