Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Sequelize-Nodejs-保存前检查外键约束_Javascript_Mysql_Node.js_Sequelize.js_Async.js - Fatal编程技术网

Javascript Sequelize-Nodejs-保存前检查外键约束

Javascript Sequelize-Nodejs-保存前检查外键约束,javascript,mysql,node.js,sequelize.js,async.js,Javascript,Mysql,Node.js,Sequelize.js,Async.js,这是保存“Orchard”记录的代码。代码可以工作,但我想了解如何以良好的方式管理包含外键(在本例中为“cropId”)的数据插入,这是因为orchardId可能是无效值(例如,它不存在),因此我想了解如何处理关于外键约束的错误 updatev2:我解决了设置错误控制器的问题。现在我唯一的问题是打印错误时出现“错误:未实现” OrchardService.add = function (req, res, next) { var orchard = req.body; db.

这是保存“Orchard”记录的代码。代码可以工作,但我想了解如何以良好的方式管理包含外键(在本例中为“cropId”)的数据插入,这是因为orchardId可能是无效值(例如,它不存在),因此我想了解如何处理关于外键约束的错误

updatev2:我解决了设置错误控制器的问题。现在我唯一的问题是打印错误时出现“错误:未实现”

 OrchardService.add = function (req, res, next) {
    var orchard = req.body;

    db.Area.create({
      name: orchard.name,
      cropId: orchard.crop,
      orchard: {}
    }, {
      include: [{model: db.Orchard, as: 'orchard'}]
    })
      .then(function (area) {
        var coords = orchard.coordinates.map(function (coord) {
          coord.areaId = area.id;
          return coord;
        });
        db.AreaCoordinate.bulkCreate(coords)
          .then(function () {
            next({status: 200, status_message: 'OK', data: {orchard: area.orchardId}})
          })
      })
      .catch(function (err) {
        if (err instanceof Sequelize.ForeignKeyConstraintError) {
          next({status: 501, status_message: 'Invalid Crop', error: err.message});
        } else {
          next({status: 500, status_message: 'Internal Server Error', error: err.message});
        }
        console.error(err);
      })
测试:

it('Add Orchard', function (done) {
    chai.request(app)
      .post('/orchard')
      .send({
        name: 'pantano',
        crop: 1232,
        coordinates: [
          {latitude: '1', longitude: '3'},
          {latitude: '2', longitude: '4'},
          {latitude: '1', longitude: '5'}
        ]
      })
      .then(function (res) {
        expect(res).to.have.status(200);
        expect(res).to.have.header('content-type', 'application/json; charset=utf-8');
        expect(res.body).to.be.an('object');
        expect(res.body).to.have.status(200);
        expect(res.body.status_message).to.equal('OK');
        expect(res.body).to.have.property('data');
        expect(res.body.data).to.have.property('orchard');
        expect(res.body.data.orchard).to.be.an('number');

        done();
      })
      .catch(function (err) {
        done(err);
      });
  });
错误:

Error: Not Implemented
    at Test.Request.callback (node_modules/superagent/lib/node/index.js:626:17)
    at node_modules/superagent/lib/node/index.js:795:18
    at IncomingMessage.<anonymous> (node_modules/superagent/lib/node/parsers/json.js:16:7)
    at endReadableNT (_stream_readable.js:1047:12)
    at _combinedTickCallback (internal/process/next_tick.js:102:11)
    at process._tickCallback (internal/process/next_tick.js:161:9)
错误:未实现
在Test.Request.callback(node_modules/superagent/lib/node/index.js:626:17)
在node_modules/superagent/lib/node/index.js:795:18
在输入消息时。(node_modules/superagent/lib/node/parsers/json.js:16:7)
在endReadableNT(_stream_readable.js:1047:12)
at _combinedTickCallback(内部/流程/下一步_tick.js:102:11)
在进程中。_tick回调(内部/process/next_tick.js:161:9)

使用哪个数据库?也许最好将其作为DB级别约束实现?是一个mysql数据库,此问题由DB级别处理,已经由DB级别处理…但是如果不存在cropId,我希望处理显示消息“无效作物id”的错误“.我本想抓住这个例外,但我不明白……问题是怎么更新的啊,我明白了。好吧,没有理由写“抛出新错误();doSomething()'作为
throw
立即将控件传递到下一个
catch
。相反,只需在特定的
catch
块中调用
next
。无意冒犯,但您不认为这是一个值得再问一个问题的不同问题吗?)至少可以说,它与问题标题没有任何关系。使用了哪个数据库?也许最好将其实现为DB级别约束?是一个mysql数据库,这个问题由DB级别处理,它已经由DB级别处理…但是如果不存在cropId,我希望处理显示消息“无效裁剪id”的错误。我本想抓住这个例外,但我不明白…问题是怎么更新的啊,我明白了。好吧,没有理由写“抛出新错误();doSomething()'作为
throw
立即将控件传递到下一个
catch
。相反,只需在特定的
catch
块中调用
next
。无意冒犯,但您不认为这是一个值得再问一个问题的不同问题吗?)至少可以说,它与问题标题没有任何关系。