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表上运行迁移。它们在本地与远程之间存在差异。但环回本身却在默默地吞噬着错误。这很糟糕。将尝试在那里提出错误报告。