0

I am new to node, building simple login page. Calling the function withing query callback and I have declared function with async still getting bellow error.

Error

{}
POST /login 500 14.005 ms - 878
Promise { <pending> }
Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (F:\eMpulse\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (F:\eMpulse\node_modules\express\lib\response.js:170:12)
    at done (F:\eMpulse\node_modules\express\lib\response.js:1004:10)
    at tryHandleCache (F:\eMpulse\node_modules\ejs\lib\ejs.js:257:5)
    at View.exports.renderFile [as engine] (F:\eMpulse\node_modules\ejs\lib\ejs.js:482:10)
    at View.render (F:\eMpulse\node_modules\express\lib\view.js:135:8)
    at tryRender (F:\eMpulse\node_modules\express\lib\application.js:640:10)
    at Function.render (F:\eMpulse\node_modules\express\lib\application.js:592:3) 

This is my controller code.

router.post('/',function(req,res,next){
    console.log('post');
    loginModel.login(req.body,function(result){
        console.log(result);
        res.render('login',{result:result});
    });

})

This is my model.

var config = require('../config/db');
var sql = require('mssql/msnodesqlv8');
var login = {
    login : async function(input,callback){
        var data = {};
        await sql.connect(config,function(err){
            if(err) throw err;
            var query = "select fld_userid from users where fld_userid='"+input.username+"'";
            new sql.Request()          
            .query(query,function(err,result){
                if(err){
                    data['db_error'] = result.originalError;
                }else{
                    if(result.recordset.length>0){
                        data = login.checkPassord(input);
                        return callback(data);
                    }else{
                        data['error']="You are not registered!";
                    }
                }
            })
        })
        return callback(data);
    },

    checkPassord:function(input){
        return new Promise(function(resolve,reject){
            var data = {};
            var query = "select fld_userid from users where fld_userid='"+input.username+"' and fld_password='"+input.password+"'";
            new sql.Request().query(query,function(err,result){
                if(err) throw err;
                    // data['db_error'] = err.originalError;
                    if(result.recordset.length>0){
                        data['res'] = result.recordset;
                    }else{
                        data['error'] = "You have entered wrong password!";
                    }
                sql.close();
                resolve(data);
            })
        })
    }
}

module.exports = login;

when I use await on this line

 data = await login.checkPassord(input);

getting bellow error

F:\eMpulse\models\login.js:15
                        data = await login.checkPassord(input);
                               ^^^^^

SyntaxError: await is only valid in async function

Please help to solve the problem. I have googled but not getting any solutions.

1 Answer 1

2

The callback where checkPassword is invoked needs to be async. Also it looks like sql.connect is not returning a promise so you should not need the await before it and the login function shouldn't need to be async.

function(input,callback){
    var data = {};
    sql.connect(config,function(err){
        if(err) throw err;
        var query = "select fld_userid from users where 
        fld_userid='"+input.username+"'";
        new sql.Request()          
        .query(query, async function(err,result){
            if(err){
                data['db_error'] = result.originalError;
            }else{
                if(result.recordset.length>0){
                    data = await login.checkPassord(input);
                    return callback(data);
                }else{
                    data['error']="You are not registered!";
                }
            }
        })
    })
    return callback(data);
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.