Использование await для определенной пользователем функции в обратном вызове mssql-запроса в узле (Express) - PullRequest
0 голосов
/ 02 декабря 2018

Я новичок в узле, создаю простую страницу входа.Вызов функции с обратным вызовом запроса, и я объявил функцию с асинхронным, все еще получая ниже ошибку.

Ошибка

{}
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) 

Это код моего контроллера.

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

})

Этомоя модель.

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;

когда я использую await в этой строке

 data = await login.checkPassord(input);

получаю ошибку ниже

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

SyntaxError: await is only valid in async function

Пожалуйста, помогите решить проблему.Я погуглил, но не получил никаких решений.

1 Ответ

0 голосов
/ 02 декабря 2018

Обратный вызов, где вызывается checkPassword, должен быть асинхронным.Также похоже, что sql.connect не возвращает обещание, поэтому вам не нужно ждать его ожидания, а функция входа в систему не должна быть асинхронной.

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...