2017-08-31 114 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表上运行迁移。他们在本地和远程存在差异。但是回环本身无声地吞咽着错误。这很糟糕。将尝试并在那里提出错误报告。 –

相关问题