2016-04-25 7 views
1

私はサーバー側に2つの.jsファイルを持っています:app.jsmanageDB.jsです。私はMongoDBからデータを取得し、それをクライアント側で使用したいと考えています。エクスポートされたモジュールから変数を返し、別のファイル(NodeJS)で使用します

manageDB.js:

exports.getClients = function() { 
    db.clients.find(function(err, docs) { 
     if (err) { 
      console.log(err); 
     } else { 
      return docs; 
     } 
    }); 
}; 

そして私はapp.jsにこのような何かをしたいと思います:

app.get('/', function(req, res) { 
    var clients = manageDB.getClients(); 
    res.render('index.html', {myClients: clients}); 
}); 

が、クライアントがあるため、非同期で定義されていません。 docsgetClientsファンクション(manageDB.jsファイル)内のコンソールに記録してもOKですが、app.jsファイル内でconsole.log(manageDB.getClients())を試してみると動作しません。助けていただければ幸いです。

答えて

2

を。 db.clients.findはこれを知っているので、コールバックが必要です。これはまさにあなたが必要とするものです。

// manageDB.js 
// Note I added `module`. It is best practice 
module.exports.getClients = function(callback) { 
    db.clients.find(callback); 
}; 

//app.js 
app.get('/', function(req, res) { 
    manageDB.getClients(function(err, docs) { 
    if (err) throw new Error(err); 

    res.render('index.html', { myClients: docs }); 
    }); 

それとも、manageDB.jsにいくつかの他の処理を行う必要がある場合:

// manageDB.js 
module.exports.getClients = function(callback) { 
    db.clients.find(function(err, docs) { 
    if (err) { return callback(err); } 
    // do more stuff 
    return callback(null, docs); 
    }); 
}; 

//app.js 
app.get('/', function(req, res) { 
    manageDB.getClients(function(err, docs) { 
    if (err) throw new Error(err); 

    res.render('index.html', { myClients: docs }); 
    }); 
あなたが実際のコードを提供している場合、それはこのように単純化することができ
2

すでに述べたように、Node.JSは非同期です。これを処理する1つの方法は、コールバックを介してデータを渡すことです。その他には、約束やコルーチンが含まれます。例えば

:その後、

module.exports.getClients = function(callback) { 
    db.clients.find(function(err, docs) { 
     if (err) { 
      console.log(err); 
      return callback(err); 
     } 

     return callback(null, docs); 
    }); 
}; 

そして、これを使用:あなたが指摘したように、JSは非同期である

app.get('/', function(req, res) { 
    manageDB.getClients(function(err, clients) { 
     if(err) { 
      // Handle error 
     } else { 
      res.render('index.html', {myClients: clients}); 
     } 
    }); 
}); 
関連する問題