2

IDからユーザー名を取得するために、以下の関数を作成しました。うまくいきません。console.log(result.first_name); と書くことができます。クエリ関数内で、ユーザー名は端末に表示されますが、ブラウザーには表示されません。「return 'something';」を追加してみました 関数の最後で、それがブラウザに表示されるかどうかを確認します – 表示されました. クエリ結果が返されるように関数を作成するにはどうすればよいですか?

関数 (app.js のグローバル関数)

function usernameFromId(id, callback){
    db.users.findOne({ _id: ObjectId(id.toString()) }, function(err, result) {
        var first_name = result.first_name;
        console.log(first_name); // names show up in the console…
        callback(first_name);
    });
};

ページ ハンドラー (app.js 内)

app.get('/books', function(req, res){
    function timeSince(dato){
        moment.lang('nb');
        return moment(dato).fromNow();
    };
    db.books.find().sort({ added:-1 }, function(err, docs) {
        var books = docs;
        db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) {
            var activity = docs;
            res.render('books', {
                books: books,
                activity: activity,
                timeSince: timeSince,
                usernameFromId: usernameFromId
            })
        });
    });
});

テンプレート (books.jade)

- each a in activity
    p=usernameFromId(a.user_id, function(name){return name;})
4

2 に答える 2

2

JavaScriptの非同期性のため、いいえ。実際の実行順序を示すために、コードにコメントを追加しました。これがエラーが発生する理由です。

function usernameFromId(id){
    var id = id.toString(); // 1
    db.users.findOne({ _id: ObjectId(id) }, function(err, result) {
        var first_name = result.first_name; // 3
    });
    return first_name; // 2
};

編集:あなたはおそらく次のようなものが欲しいでしょう

function usernameFromId(id, callback){
    var id = id.toString();
    db.users.findOne({ _id: ObjectId(id) }, function(err, result) {
        var first_name = result.first_name; 
        callback(first_name);
    });
};
于 2012-04-24T00:23:04.277 に答える
-1

さて、私は解決策を見つけました。それが良いかどうかはわかりませんが、うまくいきます。関数は必要ありません。

ページ ハンドラー (app.js 内):

app.get('/books', function(req, res){
    db.activity.find().limit(9).sort({ time:-1 }, function(err, docs) {
        var activity = docs;
        db.users.find(function(err, docs) {
            var users = docs;
            res.render('books', {
                page_title:'books',
                activity: activity,
                users: users
            })
        });
    });
});

テンプレート (books.jade):

- each a in activity
    - for u in users
        - if (a.user_id == u._id.toString())
            | #{u.first_name}
于 2012-04-25T13:15:10.137 に答える