Javascript 代码在生产环境和本地环境中的行为不同

Javascript 代码在生产环境和本地环境中的行为不同,javascript,node.js,loopbackjs,Javascript,Node.js,Loopbackjs,我有一个环回应用程序,我在其中创建了一些种子脚本来预填充数据库 这是种子 const remote = { "name": "remote", "email": "remote@ttt.com", "password": "arglebargle" } app.models.AppUser.find({where: {email: 'remoteUser@ttt.com'}}) .then(res => { if (res.length =

我有一个环回应用程序,我在其中创建了一些种子脚本来预填充数据库

这是种子

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
      })
    }
  }
上面的代码可能不是很好的基于承诺的代码。但这在其他情况下效果很好,所以我不确定我是否可以责怪它

运行上面的脚本会创建“远程”用户,并在本地为其分配“远程”角色,但是它在生产中没有任何作用,我就是不明白为什么


我能想到的生产和本地之间唯一的区别是,我从不同的位置给他们打电话(项目根不同)

我在这里看到了几个问题。首先,在这个街区:

  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
您正在从一个函数返回一个错误和一个承诺。那么这里:

    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或第一次调用中发生的任何错误。因此,像数据库这样在生产中无法访问的东西永远不会出现


希望这有帮助

非常好。我也不知道我可以使用Promise.reject(错误)这是一个很好的指针。我们将结合您的建议,看看这是否在生产中如预期的效果。谢谢您的帮助。结果问题不同了。我需要在mysql表上运行迁移。它们在本地与远程之间存在差异。但环回本身却在默默地吞噬着错误。这很糟糕。将尝试在那里提出错误报告。