Search code examples
javascriptnode.jsknex.jsobjection.js

Objection.js - insert data based on "where" condition


I want to insert a data into my database based on "where" condition, but I couldn't success.

Objection.js :

const User = require('../../database/models/user');

router.route('/register')
.get((req,res,next)=>{
    res.render('user/register')
})
.post((req,res,next)=>{
    const {email, password} = req.body;
    const user = User.query().where('email', '=', email);
    
    if(user){
       console.log('user exists');
       // do something
    }
    if(!user){
       console.log('user doesnt exist');
       // do something
    }
})

In any case, it prints "user exists". I think its because "user" returns a promise.

I tried also this :

const User = require('../../database/models/user');

router.route('/register')
.get((req,res,next)=>{
    res.render('user/register')
})
.post((req,res,next)=>{
    const {email, password} = req.body;
    User.query().where('email', '=', email).then(row => {
        if(row.length == 1){
            console.log('user exists');
        }
        if(row.length == 0){
            User.query().insert({
                email : email,
                password : password
            })
        }
    });
})

But it doesn't insert the data to the database. I don't know how can i insert data into my database based on a condition. Do you know how can i fix it? Thank you!


Solution

  • You are missing .then or await from the insert query

    This should work:

    const User = require('../../database/models/user');
    
    router.route('/register')
    .get((req,res,next)=>{
        res.render('user/register')
    })
    .post((req,res,next)=>{
        const {email, password} = req.body;
        User.query().where('email', '=', email).then(row => {
            if(row.length == 1){
                console.log('user exists');
            }
            if(row.length == 0){
                User.query().insert({
                    email : email,
                    password : password
                }).then(result => {
                  res.status(204).send();
                })
            }
        });
    })