如何从Nodejs中的异步数据库回调中保存数据并表达?

时间:2016-02-23 10:56:27

标签: javascript node.js express sqlite

我正在查询我的sqlite3数据库以检查用户详细信息,然后在查询完成后调用回调方法。在回调中我可以很好地访问数据,但是当我想复制该数据时,即将值分配给会话变量或全局实例时,一旦回调完成,它就变为未定义。我的问题是,我该如何避免这种情况?

var custFuncs                   = require( '../functions' );
var arrRow = []


// process log in.
router.post( '/login', upload.array(), function( req, res )
{
    custFuncs.checkAuthDetails( req.body.uname, req.body.pass, function ( row )
    {
        //req.session.userID = row.id;
        arrRow.push( row.id );
        console.log( arrRow ); // PRINTS OUT [ 1 ] HERE
    } );

    console.log( arrRow ); // PRINTS OUT [] HERE
    res.redirect( '/' );
});

然后在functions.js中:

function checkAuthDetails( userName, pass, callback )
{  
    var hashedPass = encrypt( pass );

    db.serialize( function()
    {
        db.get( "SELECT id, uname, pass FROM user WHERE uname = ?", [userName], function( err, row )
        {
            if( (row.id > 0) && (row.pass == hashedPass) )
            {
                callback( row );
            }
        });
    });
}

1 个答案:

答案 0 :(得分:0)

它之所以这样做是因为它们是异步调用。您应该看到打印空数组的那个在用户ID为的之前被调用。这是因为它首先到达了这个。当您致电<StackPanel> <!-- BINDING NOT WORKING --> <ContentControl Content="{StaticResource panel}" /> <!-- BINDING WORKING HERE --> <CheckBox x:Name="chkDefaultValue" Content="Default Value" IsChecked="{Binding ElementName=txtDefaultValue, Path=Text.Length, Mode=OneWay}" /> <TextBox x:Name="txtDefaultValue" Text="{Binding DefaultValue, Mode=TwoWay, ValidatesOnDataErrors=True}" IsEnabled="{Binding ElementName=chkDefaultValue, Path=IsChecked}" /> </StackPanel> 时,它会直接转到该功能的下一行代码,而不是等待costFuncs.checkAuthDetails的回调被调用。

您想要对数据做的任何事情都必须在回调后完成。