2017-12-20 20 views
2

私はの機能にアクセスしようとするとエラーになります。routeです。私はマングースを使いました。Nodejs Promise TypeError:未定義のプロパティ 'then'を読み取ることができません

エラー:ここ

TypeError: Cannot read property 'then' of undefined at /private/var/www/html/sms/server/routes/user.routes.js:70:9 at Layer.handle [as handle_request] (/private/var/www/html/sms/node_modules/express/lib/router/layer.js:95:5) at next (/private/var/www/html/sms/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/private/var/www/html/sms/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/private/var/www/html/sms/node_modules/express/lib/router/layer.js:95:5) at /private/var/www/html/sms/node_modules/express/lib/router/index.js:281:22 at Function.process_params (/private/var/www/html/sms/node_modules/express/lib/router/index.js:335:12) at next (/private/var/www/html/sms/node_modules/express/lib/router/index.js:275:10) at Function.handle (/private/var/www/html/sms/node_modules/express/lib/router/index.js:174:3) at router (/private/var/www/html/sms/node_modules/express/lib/router/index.js:47:12) at Layer.handle [as handle_request] (/private/var/www/html/sms/node_modules/express/lib/router/layer.js:95:5) at trim_prefix (/private/var/www/html/sms/node_modules/express/lib/router/index.js:317:13) at /private/var/www/html/sms/node_modules/express/lib/router/index.js:284:7 at Function.process_params (/private/var/www/html/sms/node_modules/express/lib/router/index.js:335:12) at next (/private/var/www/html/sms/node_modules/express/lib/router/index.js:275:10) at /private/var/www/html/sms/server.js:65:3 POST /api/user/create 500 27.274 ms - 16 (node:11300) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: This email is already exists. Please enter another email. (node:11300) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

は私のコードは次のとおりです。 -

user.cont.js

function create(data) { 
    User.findOne({ email: data.email }) 
    .exec((err, doc) => { 
     if (err) { 
     return new Promise((resolve, reject) => { 
      return reject(err); 
     }) 
     } else { 
     if (doc) { 
      return new Promise((resolve, reject) => { 
      return reject(new Error('This email is already exists. Please enter another email.')); 
      }) 
     } else { 
      const user = new User(data); 
      return user.save() 
     } 
     } 

    }) 

} 


export default { getUsers, create }; 

user.route.js

router.post('/create', (req, res, next) => { 
     UserCtrl.create(req.body) 
      .then(savedUser => res.json(savedUser)) . // here error is generated 
      .catch(e => next(e)); 
    }); 
+0

'create'関数に' return'がありません。 –

答えて

0

あなたがそうのように、約束に全体User.findOne()呼び出しをラップする必要があります:あなたはまた、約束を解決する必要があり

function create(data) { 
    return new Promise((resolve, reject) => { 
    User.findOne({ email: data.email }) 
     .exec((err, doc) => { 
     if (err) return reject(err) 
     if (doc) return reject(new Error('This email is already exists. Please enter another email.')) 
     const user = new User(data) 
     user.save((err) => { 
      if (err) return reject(err) 
      resolve() 
     }) 
     }) 
    }) 
} 

、そうでない場合は、あなたのUserCtrl.then()通話中にコールバックが呼び出されることはありません。新しいUserをデータベースに保存して何か問題が発生した場合のエラー処理も追加しました。

+0

もちろん、現在のバージョンのMongooseでは '.findOne'はPromiseを返しますので、この約束のコンストラクタを避けることができます –

関連する問題