0

私は自分のコードと少し混乱していますが、本来のように同期して動作していません。私はeveryauthを使用して認証を行います。

registerUser(function(newUserAttrs) {
        var login = newUserAttrs[this.loginKey()];
        user.CreateNewUser(newUserAttrs.login, newUserAttrs.password, newUserAttrs.email, function(res, err) {
            if(!err) {
                return usersByLogin[login] = newUserAttrs;
            }
            else {
                throw err;
            }

        });

    })

別のファイルにこのコードを書きました

exports.CreateNewUser = function(login, pass, mail, callback) {

    var sql = "insert into `user`(login,mail,pass) values(?,?,?)";
    client.query(sql, [login, mail, pass], function(err, results, fields) {
        if(!err) {
            callback(results);
            console.log('test')
        }
        else {
            callback(results, err);
        }
    });
};

このコードは正常に機能しています。私は彼をテストしました。唯一の問題は、それらが同期して動作していることです(通常どおり)。誰かが私がそれを非同期にする間違った方法で何をしたかを私に説明できますか?同期してやりたいです。

現在のコードは私にエラーを与えます(それはデータベースにエントリを作成し、ブラウザでエラーを生成します)

Error: Step registerUser of `password` is promising: userOrErrors ; however, the step returns nothing. Fix the step by returning the expected values OR by returning a Promise that promises said values.
    at Object.exec (E:\proj\Node\node_modules\everyauth\lib\step.js:68:11)
    at E:\proj\Node\node_modules\everyauth\lib\stepSequence.js:26:38
    at [object Object].callback (E:\proj\Node\node_modules\everyauth\lib\promise.js:13:12)
    at RouteTriggeredSequence._bind (E:\proj\Node\node_modules\everyauth\lib\stepSequence.js:25:20)
    at RouteTriggeredSequence.start (E:\proj\Node\node_modules\everyauth\lib\stepSequence.js:52:33)
    at RouteTriggeredSequence.routeHandler (E:\proj\Node\node_modules\everyauth\lib\routeTriggeredSequence.js:13:13)
    at Object.<anonymous> (native)
    at nextMiddleware (E:\proj\Node\node_modules\connect\lib\middleware\router.js:175:25)
    at param (E:\proj\Node\node_modules\connect\lib\middleware\router.js:183:16)
    at pass (E:\proj\Node\node_modules\connect\lib\middleware\router.js:191:10)

ありがとう

4

2 に答える 2

1

データベースクエリを実行しているため、このコードは非同期である必要があります。渡した無名関数client.queryはデータベースクエリが完了するまで呼び出されないため、callback非同期で呼び出されます。

これをすべて非同期として扱う必要があるため、たとえば、ユーザーオブジェクトを返す/スローする代わりに、他のコールバックをトリガーする必要があります。

于 2012-06-07T15:34:19.780 に答える
1

提示する2つのコードは非同期であり、同期ではありません。everyauthでは、非同期ユーザー作成を処理できるようにするには、Promiseを使用する必要があります。したがって、コードは次のようになります。

registerUser(function(newUserAttrs) {
    var promise = this.Promise();
    var login = newUserAttrs[this.loginKey()];
    user.CreateNewUser(newUserAttrs.login, newUserAttrs.password, newUserAttrs.email, function(res, err) {
        if(!err) {
            return promise.fulfill(newUserAttrs);
        }
        else {
            promise.fulfill(user);
        }

    });

})

約束なしに、新しいユーザーがデータベースに追加されたことを確認できませんでした。しかし、それが問題ではない場合は、次のようなものがあります。

registerUser(function(newUserAttrs) {
    var login = newUserAttrs[this.loginKey()];
    user.CreateNewUser(newUserAttrs.login, newUserAttrs.password, newUserAttrs.email, function(res, err) {
        if (err) console.log(err);
    });
    return newUserAttrs;

})
于 2012-06-08T13:32:41.133 に答える