2

これがばかげているように聞こえる場合は申し訳ありませんが、私はまだサーバー側の Javascript を学んでいます。app.js ファイルにこのコードがあります。

var test;

UserModel.findOne({name: 'guest'}, function(err, user) {
    test = user.name;
});

console.log(test);

UserModel.findOne非同期であるため、これが機能しないことを理解しています。したがって、すべてがコールバック内で発生する必要があります。たとえば、終了console.log(test)前に実行できます。UserModel.findOne

質問

var testapp.js ファイルで宣言した場合、 user.name(経由でUserModel.findOne) の値を取得する方法はありますか?

これを行う理由は、事前にデータベースからこれらすべての情報を取得することを望んでいるためです。そのため、ユーザー名が必要になるたびにデータベース クエリを作成する必要はありません。

この考えが適切でない場合、同様の代替手段はありますか?

編集・更新

これは、認証/ログインには使用されません。すべてのユーザーが変数testとその内容にアクセスできるようにします。

test基本的に、変数が永続的に設定されずuser.name、代わりにコールバックの範囲内でのみステップが取得される理由を尋ねています。また、変数を永続的に設定することは可能ですか?

4

4 に答える 4

2

例:

var users = {};
function getUser(username, callback) {
    if (typeof users[username] !== 'undefined') {
        callback(users[username]);
    } else {
        Users.findOne({"name":username}, function(err, user) {
            users[username] = user;
            callback(user);
        });
    };
};

これにより、キャッシュまたはmongodbから常に名前付きユーザーが返されます。これは、findOne と同じ方法で呼び出されます。

getUser('guest', function(user) { console.log(user); });

その後、キャッシュから直接ユーザーにアクセスするか、変数に割り当てることができます。ただし、最初に getUser が成功したことを確認する必要があります。

Node.js で最も難しいことの 1 つは、記述されたソースの通常のフローの外でコードが呼び出されることを理解することです。コードがコールバックを伴う関数の呼び出しに従うだけでは不十分です。

于 2012-09-22T18:09:03.347 に答える
1

アプリのすべてのユーザーがそのtest変数を共有することを考えると、これは悪い考えのように思えます。これは、必要に応じて検索したくない場合に、ユーザーのセッションに保存する種類のデータです。

編集

testグローバル スコープまたはモジュール スコープで宣言している限り、findOneコールバックで永続的に設定されます。

于 2012-09-22T15:50:03.410 に答える
0

はい、結果をより高いスコープの変数に適用できます。たとえば、これは機能するはずです。

var test;

function getTest() {
   console.log(test);
}

UserModel.findOne({name: 'guest'}, function(err, user) {
   test = user.name;

   getTest();
});
于 2012-09-22T15:53:21.933 に答える