2017-08-31 9 views
1

私はループバックアプリケーションを使用して、シードスクリプトを作成してデータベースにあらかじめ入力しています。ここでプロダクションとローカルで動作が異なるコード

シード

const remote = { 
    "name": "remote", 
    "email": "[email protected]", 
    "password": "arglebargle" 
} 

app.models.AppUser.find({where: {email: '[email protected]'}}) 
    .then(res => { 
     if (res.length === 0) { 
      createUsers(remote, 'remote') 
     } else { 
      console.log('remote user already exists') 
     } 
    }) 

ですこれはおそらく良い約束ベースのコードではありません

const app = require('../server') 
const Promise = require('bluebird'); 

module.exports = { 
    createUsers: (userInfo, roleName) => { 
    if (!userInfo || !roleName) { 
     let err = new Error('please give valid user and role names') 
     console.log(err) 
     return err 
    } 
    console.log(userInfo) 
    return app.models.AppUser.findOrCreate({where: {'name': userInfo.name}}, userInfo) 
     .then((instance) => { 
     return app.models.Role.findOne({where: {name: roleName}}) 
      .then((role) => { 
       return role.principals.create({ 
       principalType: app.models.RoleMapping.USER, 
       principalId: instance[0].id //find or create returns an array 
      }) 
     }) 
     }) 
     .catch((error) => { 
     return error 
     }) 
    } 
    } 

以上下回っているcreateUsersを呼び出します。しかし、これは他の状況でうまくいきますので、私がそれを責めることができるかどうかはわかりません。

上記のスクリプトを実行すると、「リモート」ユーザーが作成され、ローカルに「リモート」ロールが割り当てられますが、プロダクションでは何も行われません。理由を特定できません。私は、生産と地元の間であると考えることができ

他の唯一の違いは、私が(プロジェクトルートが異なる)

答えて

2

私はここに夫婦の問題を参照してください別の場所からそれらを呼び出していますということです。まず、このブロックで:

createUsers: (userInfo, roleName) => { 
    if (!userInfo || !roleName) { 
     let err = new Error('please give valid user and role names') 
     console.log(err) 
     return err 
    } 
    console.log(userInfo) 
    return app.models.AppUser.findOrCreate 

エラーとプロミスを1つの関数から戻しています。

createUsers: (userInfo, roleName) => { 
    if (!userInfo || !roleName) { 
    let err = new Error('please give valid user and role names') 
    console.log(err) 
    return Promise.reject(err) 
    } 
    ... 
:そして、ここに:それはそうと同じように、あなたが行っている方向のようだとして、あなたが createUsers

から完全に戻り値を無視している

if (res.length === 0) { 
     createUsers(remote, 'remote') 
    } else { 
     console.log('remote user already exists') 
    } 

私は、約束に固執したいです

そしてはすべての約束をで処理する必要があります。そうしないと、自動的に失敗します。

if (res.length === 0) { 
    createUsers(remote, 'remote') 
    .then(result => console.log('got a result')) 
    .catch(error => console.error('oh no!', error)) 
} else ... 

そして、エラーが発生した場合にも、最初のAppUser.findが処理されていない:

app.models.AppUser.find({where: {email: '[email protected]'}}) 
    .catch(err => console.error('yikes!', err)) 
    .then(res => { 

あなたが今をを持っているコードは黙っcreateUsersに発生したエラーを飲み込むか、そのう最初の呼び出し。したがって、本番環境では到達不可能なデータベースのようなものは決してそれ自体を提示しません。

希望すると便利です。

+0

優れた点。また、大きなポインタであるPromise.reject(エラー)を使用できるかどうかはわかりませんでした。あなたの提案を組み込み、プロダクションで期待どおりに動作するかどうかを確認します。 –

+0

ご協力いただきありがとうございます。問題は異なっていることが判明した。私はmysqlテーブルで移行を実行する必要がありました。ローカルとローカルの違いがありました。しかし、ループバックはそれ自体、エラーを静かに飲み込んでいました。それはかなり悪いです。そこにバグレポートを作成しようとします。 –

関連する問題