2016-01-06 3 views
0

При обновлении связанного объекта я получаю два совершенно разных поведения из одного и того же кода. Например, вопрос принадлежит ученику. Я запускаю код ниже на двух отдельных машинах.Обновленные связанные объекты в Loopback ведут себя непоследовательно

Question.observe('after save', function (ctx, next) { 

    var question = ctx.instance 

    question.student(function (err, student) { 
     student.updateAttributes({points: student.points - question.points}) 
    }) 

next(); 

}) 

На первой машине он отлично работает. Поэтому я подумал, что все готово. Но потом, когда я бегу точно такой же код на другой машине я получаю следующее сообщение об ошибке:

student.updateAttributes({points: student.points - question.points}) 
             ^
    TypeError: Cannot read property 'points' of null 

Я использую разъем памяти

"db": { 
    "name": "db", 
    "connector": "memory", 
    } 

Единственное, что я думать о том, что у меня есть две разные версии loopback (одна с ошибкой, а другая без) ... но тогда package.json точно так же и для обоих !?

{ 
    "name": "foo", 
    "version": "1.0.0", 
    "main": "server/server.js", 
    "scripts": { 
    "start": "node .", 
    "pretest": "jshint .", 
    "test": "mocha" 

    }, 
    "dependencies": { 
    "compression": "^1.0.3", 
    "cors": "^2.5.2", 
    "loopback": "^2.22.0", 
    "loopback-boot": "^2.6.5", 
    "loopback-component-explorer": "^2.1.0", 
    "loopback-datasource-juggler": "^2.39.0", 
    "serve-favicon": "^2.0.1" 
    }, 
    "devDependencies": { 
    "chakram": "^1.2.1", 
    "jshint": "^2.8.0", 
    "loopback-testing": "^1.2.0", 
    "mocha": "^2.3.4", 
    "mocha-bamboo-reporter": "^1.1.0" 
    }, 
    "repository": { 
    "type": "", 
    "url": "" 
    }, 
    "description": "foo" 
} 

ответ

1

Вы не проверяете ошибки при работе с номером question.student. Поэтому сначала вам нужно это исправить.

Тогда, возможно, не полностью связанный, но question.student, скорее всего, асинхронный, поэтому вы вызываете next до того, как question.student закончен.

Лучше код будет выглядеть следующим образом

Question.observe('after save', function (ctx, next) { 
 

 
    var question = ctx.instance 
 

 
    question.student(function (err, student) { 
 
    if (err) return next(err); 
 
     
 
    student.updateAttributes({points: student.points - question.points}) 
 
      
 
    next(); 
 
    }); 
 
});

Кроме того, я не знаю ничего о updateAttributes, но если это асинхронная вы также должны вызвать next() только один раз он закончил (с использованием callback, как вы делали для question.student, например), а также для проверки ошибок.

ВСЕГДА проверяем ошибки. Это не просто хорошая практика.

1

Ваш packages.json указывает, что пакет должен быть выше, чем установленное версии, чтобы вы могли иметь одну машину, где версия для loopback является v2.23.0 и один в v2.26.2 (текущая последняя), если вы запускали npm install в разное время.

Вы можете запустить npm list на обеих машинах, чтобы сравнить версии, которые установлены.

Запустить npm update для обновления пакетов.

Чтобы обновить свой пакет.json, чтобы использовать самые последние зависимости, ознакомьтесь с этим answer.

+1

Возможно, он мог запустить 'npm loopback -v', чтобы проверить версии loopback – Overdrivr

+0

@Overdrivr' npm list' для всех зависимостей (я просто выбрал loopback в качестве примера, поскольку все они указаны одинаково. Спасибо за комментарий , добавил к ответу. – conradj