2

I am using Knex to do a simple select query from the database. I have returned a value in then function and added await before the async call. But await doesn't wait and always keep running next line with undefined value.

This is User model file with the console.log for the query result, this always get print last:

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;

and this is the controller, the console.log here is always printed first:

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);
}
2
  • 4
    You don't return the Promise from the method, so there's nothing to await. Commented Jul 3, 2021 at 14:57
  • @JaredSmith I have fixed this error but I am still confused. Inside then in findByNameAndPassword method, I return rows, which is converted into a Promise as the doc states. But why does it doesn't work. Commented Jul 4, 2021 at 2:31

2 Answers 2

1

In order for await to work, you need to use it on a function that returns a promise, or a promise itself.

To do so in this instance, put return before knex('user') in your User.findByNameAndPassword function.

Sign up to request clarification or add additional context in comments.

2 Comments

thank you very much I solved my problem. But as I read, if I use return in then, it implicitly wrap that returned value in a promise. So the return statement in then would return a promise to the controller. But why that doesn't work?
can you help me with this? I am confused because as the doc states, return from then would return a promise.
1

Well, according to the code shared by you, it seems that findByNameAndPassword is a Synchronous Function. So awaiting will not help in controller. You might want to update your findByNameAndPassword to an Async one. Like this

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;

That should do it. What we are doing in this code is, we are trying to get the rows in the try block. And if it FAILS, the catch block will register an error and log the error for us.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.