2

セッション認証用にrestifyミドルウェアを実装しています。この関数には、ネストされた非同期db呼び出しが含まれています:db.sessions.findOne()のコールバック内のdb.sessions.remove()。

'return'ステートメントは、コールバックからverifyUserSession()に戻ってnext()またはnext(err)を返しているのか、それともverifyUserSessionsから戻っているだけなのかわからないため、混乱しています。私はこれを正しくやっていますか?

function verifyUserSession(req, res, next) {


if (req.headers.sessionKey) 
{
    db.sessions.findOne(req.headers.sessionKey, function(err, session) {

        if (err) 
        {
            return next(err);
        }
        if (!session) 
        {
            return next(new Error({'message': 'Session does not exist'}));
        }

        if ((new Date().getTime() - session.timestamp.getTime())/86400000 > 60)
        {
            db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){
                if (err) 
                {
                    return next(err);
                }
                return next(new Error({'message': 'Session expired'}));
            });
        }
        else
        {
            // session ok
        }
    });
}
}
4

2 に答える 2

2

コールバックを適切に使用しています。

return現在のコールバックから戻るためにのみ使用されます。呼び出すreturn next(...)と、コールバック関数を呼び出し、それが返す値を返します。多くの場合、リターンは、コールバックを2回呼び出さないようにするためにのみ必要です。

関数内のすべての可能なブランチがコールバックを呼び出すことを確認する必要があることに注意してください。そうしないと、プログラムはから続行されませんverifyUserSession。あなたが与えたコード例では、これは2つのケースで起こります:1)セッションがOKの場合、2)req.headers.sessionKeyが設定されていない場合。これらのブランチにもコールバックを追加する必要があります。

于 2012-10-24T07:44:30.003 に答える
1

非同期コーディングのreturnステートメントは、ブロックコードのそれ以上の実行を中断するためにのみ使用されます。基本的にこれ:

db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){
    if (err) 
    {
        return next(err);
    }
    return next(new Error({'message': 'Session expired'}));
});

と同等です:

db.sessions.remove({sessionKey: req.headers.sessionKey}, function(err){
    if (err) 
    {
        next(err);
        return;
    }
    next(new Error({'message': 'Session expired'}));
    return;
});

最後の返却は不要ですのでご注意ください。

于 2012-10-24T09:56:34.737 に答える