Loopback中更新的相关对象行为不一致

时间:2016-01-06 05:32:32

标签: node.js loopbackjs strongloop

更新相关对象时,我从同一代码中获得两种完全不同的行为。例如,一个问题属于学生。我在两台独立的机器上运行下面的代码。

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",
   }

我唯一想到的是我有两个不同版本的环回(一个有bug而另一个没有)...但是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"
}

2 个答案:

答案 0 :(得分:1)

您的packages.json指定一个包应该高于一个设置版本,因此您可以拥有一台机器,loopback的版本为v2.23.0,而v2.26.2的版本为npm install如果你在不同的时间运行npm list,那么这是最新的。

您可以在两台计算机上运行npm update以比较已安装的版本。

运行SELECT sum(price) FROM ( select distinct userid FROM purchase ) u, LATERAL ( SELECT price FROM purchase p WHERE p.userid = u.userid ORDER BY date DESC LIMIT 1 ) x 更新软件包。

要更新package.json以使用最新的依赖项,请查看此answer

答案 1 :(得分: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()(使用与{{1}相同的回调函数)例如),并检查错误。

始终检查错误。这不仅仅是一种很好的做法。