Just do IT

思うは招く

Missing where attribute in the options parameterの解決メモ

背景

練習でSequelizeライブラリを使用して簡単なウェブアプリケーションを作っていた。updateを使用して、データベースをアップデート(書き換え)しようとしたら、次のエラーが出た。

Unhandled rejection AssertionError [ERR_ASSERTION]: Missing where attribute in the options parameter

結論から言うと、とてもあっけなく解決した。

環境

  • Node.js(v10.14.2)
  • Express(4.16.0)

解決方法

ただ単に、updateの書き方を間違っていた。問題の箇所はPOSTデータを受け取り、Taskというデータベースを編集するあたり。

router.post('/:taskId', authenticationEnsurer, (req, res, next) => {
  Task.findOne({
    where: { taskId: req.params.taskId }
  }).then((task) => {
    if (task) {
      if (parseInt(req.query.edit) === 1) {
        const updatedAt = new Date();
        task.update({
          taskId: task.taskId,
          taskName: req.body.taskName.slice(0, 255) || '(名称未設定)',
          memo: req.body.memo,
          deadLine: req.body.deadLine,
          createdBy: req.user.id,
          updatedAt: updatedAt
        }).then((task) => {
          res.redirect('/tasks/' + task.taskId);
        });
      } else {

なおコード上部ではTaskという変数名でmodelをrequireしている。

const Task = require('../models/task');

本来ならtask.updateとするところを、Task.updateにしてしまっていた。 findOneでデータベースから絞り込み、コールバックで受け取ったtaskに対してupdateをすべきだった。