2017-08-31 78 views
1

我有一個Loopback應用程序,我已經創建了一些種子腳本來預先填充數據庫。代碼在生產和本地中的行爲有所不同

這裏是種子

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') 
     } 
    }) 

這需要調用createUsers,低於

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 
     }) 
    } 
    } 

上面可能不是很好的基礎諾言代碼。但是在其他情況下這種方式工作正常,所以我不確定我是否可以指責它。

運行上面的腳本會創建'remote'用戶,並在本地爲其指定'remote'角色,但它在生產中不會執行任何操作,我只是無法弄清楚原因。

的另一個區別我能想到的生產和地方之間的是,我從不同的地點打電話給他們(項目的根是不同的)

回答

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 

你從一個函數返回一個Error和Promise。那麼在這裏:

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

你完全從createUsers

忽略返回值我會堅持的承諾,因爲這似乎是你要去的方向,就像這樣:

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

和你必須處理每一個承諾,否則它會默默地失敗。

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

你有現在會默默地吞下發生在調用createUsers或任何錯誤代碼:

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

並且也第一AppUser.find未被如果有錯誤處理第一次通話。所以,像生產中無法訪問的數據庫這樣的東西永遠不會出現。

希望這會有所幫助!

+0

非常棒的積分。也不知道我可以使用Promise.reject(錯誤),這是一個偉大的指針。將納入您的建議,並看看這是否符合預期的生產。 –

+0

感謝您的幫助。問題原來是不同的。我需要在mysql表上運行遷移。他們在本地和遠程存在差異。但是迴環本身無聲地吞嚥着錯誤。這很糟糕。將嘗試並在那裏提出錯誤報告。 –

相關問題