2016-01-27 8 views
10

私はExpress with Promiseを使用しています。promise with node.jsの使用方法?

router.post('/Registration', function(req, res) { 
    var Promise = require('promise'); 
    var errorsArr = []; 
    function username() { 
    console.log("agyaaa"); 
    return new Promise(function(resolve, reject) { 
     User.findOne({ username: req.body.username }, function(err, user) { 
     if(err) { 
      reject(err) 
     } else { 
      console.log("yaha b agyaaa"); 
      errorsArr.push({ msg: "Username already been taken." }); 
      resolve(errorsArr); 
     } 
     }); 
    }); 
    } 
    var username = username(); 
    console.log(errorsArr); 
}); 

私はerrorsArrayにログインすると、それが空であると私は理由を知りません。私はnode.jsの新機能です前もって感謝します。

+4

'username = username();'はあなたが望むものではありません。 – Bergi

+0

はい、プロミスを再チューニングしています。 'username.then(function(data){console.log(...)});' – anolsi

+0

のようなことをする必要がありますか?事前にありがとう – hu7sy

答えて

11

約束事の仕組みを理解するために、次の文書をお読みになり、https://www.promisejs.org/の文書をお読みください。

var Promise = require('promise'); 
router.post('/Registration',function(req,res,next) { 
    function username() { 
     console.log("agyaaa"); 
     return new Promise(function(resolve,reject) { 
      User.findOne({"username":req.body.username}, function(err,user) { 
       if (err) { 
        reject(err) 
       } else { 
        console.log("yaha b agyaaa"); 
        var errorsArr = []; 
        errorsArr.push({"msg":"Username already been taken."}); 
        resolve(errorsArr); 
       } 

      }); 
     }); 
    } 
    username().then(function(data) { 
     console.log(data); 
     next(); 
    }); 
}); 

他のエラー(またはそのようにするべきではないこと)もあります。私はあなたにプロミスの基本的な使い方を示しています。

+0

node8必要( '約束')? – stackdave

+3

いいえ、@stackdave、ノードv0.12(!)ではありません - [node.green](http://node.green/#ES2015-built-ins-Promise)を参照してください。 –

+0

@anolsiしかし、約束が解決された後にデータをresに書き込む方法はありますか? Expressは、関数が終了すると直ちにresを返します。 –

2
router.post('/Registration', function(req, res) { 
    return User 
     .findOne({ username: req.body.username }) 
     .then((user) => { 
      if (user) { 
       return console.log({ msg:"Username already been taken" }); 
      } 
      return console.log({ msg: "Username available." }); 
     }) 
     .catch((err)=>{ 
      return console.error(err); 
     }); 
}); 

このようにクリーンなコードを書くことができます。 プロミスは、グローバル変数であり、それを必要としません。

関連する問題