Express and Sequelize: установить внешний ключ в сообщении роутера - PullRequest
0 голосов
/ 19 января 2019

Я пытаюсь сделать так, чтобы при вызове пост-запроса к /api/routines была создана строка в таблице подпрограмм, которая установила внешний ключ userId для текущего пользователя. Вот моя обычная модель:

const Routine = db.define('routine', {
  name: {
    type: Sequelize.STRING,
    allowNull: false,
    validate: {
      notEmpty: true
    }
  }
})

Вот мои ассоциации:

User.hasMany(Routine)
Routine.belongsTo(User)

А вот мой метод сообщения роутера:

router.post('/', async (req, res, next) => {
    try {
        const routine = await Routine.create({
            name: req.body.Title
        })
        const user = await User.findOne({ where: { id: req.body.user } })
        await routine.setUser(user) //This is where I need help! This line doesn't work
        await user.hasOne(routine)
        res.json(routine)
    } catch (err) {
        next(err)
    }
})

Я не уверен, как добавить внешний ключ, связывающий процедуру с пользователем. Дайте мне знать, если у вас есть идеи. Спасибо.

1 Ответ

0 голосов
/ 05 июня 2019

У меня есть приложение, которое, я думаю, делает то, что вы хотите.Для начала вам нужно сохранить идентификатор того, кто вошел в ваш контекст.Для этого в моем файле src/index.js есть следующий импорт:

import models, { sequelize } from './models';
import routes from './routes';

Затем, далее в этом же файле, у меня есть следующий код:

app.use(async (req, res, next) => {
    req.context = {
      models,
      me: await models.User.findByLogin(username),
    };
    next();
  });

Гдепеременная username содержит имя текущего пользователя, вошедшего в систему.

Затем у меня есть конечная точка answer, где пользователи могут публиковать ответы, что аналогично вашей конечной точке routine.Маршрут публикации в моем случае выглядит следующим образом:

router.post('/', async (req, res) => {
  const answer = await req.context.models.Answer.create({
    text: req.body.text,
    userId: req.context.me.id,
  });

  return res.send(answer);
});

Как видите, я публикую текст ответа и идентификатор пользователя одновременно.В вашем случае, я думаю, это будет выглядеть следующим образом:

router.post('/', async (req, res, next) => {
    try {
        const routine = await Routine.create({
            name: req.body.Title,
            userId: req.context.me.id
        });

        return res.json(routine);

    } catch (err) {
        next(err)
    }
})

Обратите внимание, что вам придется настроить userId в приведенном выше коде для любого имени поля, которое вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...