代码在本地生产中的行为有所不同

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

这是种子

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

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

运行上面的脚本创build“远程”用户,并将“远程”angular色分配给本地,但是它在生产中不做任何事情,我只是不知道为什么。

我可以想到生产与本地之间的唯一差别是我从不同的地方打电话给他们(项目根源不同)

我在这里看到一些问题。 首先,在这个区块:

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

希望这可以帮助!