代码在生产与本地的行为方式不同

时间:2017-08-31 06:35:17

标签: javascript node.js loopbackjs

我有一个Loopback应用程序,我已经创建了一些种子脚本来预先填充数据库。

这是种子

const remote = {
    "name": "remote",
    "email": "remote@ttt.com",
    "password": "arglebargle"
}

app.models.AppUser.find({where: {email: 'remoteUser@ttt.com'}})
    .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
      })
    }
  }

以上可能不是基于良好承诺的代码。但这在其他情况下工作正常,所以我不确定是否可以责怪它。

运行上面的脚本会创建“远程”用户并在本地为其分配“远程”角色,但是它在生产中没有做任何事情,我只是无法找出原因。

我在生产和本地之间可以想到的另一个区别是我从不同的位置调用它们(项目根目录不同)

1 个答案:

答案 0 :(得分: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)
  }
  ...

并且必须处理每个承诺,否则它将无声地失败。

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: 'remoteUser@ttt.com'}})
   .catch(err => console.error('yikes!', err))
   .then(res => {

现在的代码将无声地吞下createUsers或首次调用中发生的任何错误。因此,像生产中无法访问的数据库这样的东西永远不会出现。

希望这有帮助!