Динамически изменить модель / схему в Express Router - PullRequest
0 голосов
/ 16 октября 2019

У меня есть экспресс-сервер, который принимает вызовы API и указывает их на определенные маршруты.

app.use('/api/data01', require('./routes/dataRoute01'))
app.use('/api/data02', require('./routes/dataRoute02'))
app.use('/api/data03', require('./routes/dataRoute03'))

В каждом маршруте есть методы, которые являются идентичными, за исключением модели, которую они вызывают.

Итак, у dataRoute01.js есть такой метод:

//CREATE
router.post('/', (req, res, next) => {
  let { name, details, content, timestamp } = req.body
  Data01.create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})

dataRoute02.js имеет такой метод:

//CREATE
router.post('/', (req, res, next) => {
  let { name, details, content, timestamp } = req.body
  Data02.create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})

Возможно ли объединить маршруты в один файл? и вместо этого динамически изменить вызываемую модель? Возможно, передавая уникальный запрос в запрос?

Возможно, что-то вроде следующего
(добавлено в source, который будет источником запроса. Это может быть одна цифра. 1 например.

Направьте все вызовы API на один и тот же маршрут.

app.use('/api/data01', require('./routes/dataRoute'))
app.use('/api/data02', require('./routes/dataRoute'))
app.use('/api/data03', require('./routes/dataRoute'))

Затем в маршруте сделайте что-то вроде:

//CREATE
router.post('/', (req, res, next) => {
  const source = req.body.source
  const schema = 'Data0' + source
  let { name, details, content, timestamp } = req.body
  schema.create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})

РЕДАКТИРОВАТЬ:
Создана новая попытка на основе ответов, опубликованных ниже.
Также добавлено в вызов API, как я думаю, это поможет в вопросе.

//api.js

  addData(source, body) {
    const url = '/data0' + source
    return service
      .post(url, body) //body here also contains the source
      .then(res => res.data)
      .catch(errHandler)
  },
//dataRoute.js

const express = require('express')
const Data01 = require('../models/Data01')
const Data02 = require('../models/Data02')
const Data03 = require('../models/Data03')

const router = express.Router()

//CREATE
router.post('/', (req, res, next) => {
  let { name, details, content, timestamp } = req.body
  Data0[req.body.source]
    .create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})

Однако обозначение в скобках, используемое непосредственно перед .create, похоже, игнорируется, что приводит к ответу об ошибке, подобному этому:

API response {stack: "ReferenceError: Data0 is not defined↵    at router…r\node_modules\express\lib\router\index.js:635:15", message: "Data0 is not defined"}

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Schemas.js

const Schema01 = require('./Schema01');
const Schema02 = require('./Schema02');
const Schema03 = require('./Schema03');

modules.exports = {
  Data01, Data02, Data03
}

router.js

const Schemas = require('./Schemas');

router.post('/api/data/:schema', (req, res, next) => {
  let { name, details, content, timestamp } = req.body;
  Schemas[req.params.schema].create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})
0 голосов
/ 16 октября 2019

Этого можно добиться, храня все данные в одном файле, как это.

data.js

module.expoprts = {
  Data01: {}, //someObject or you can require another module here
  Data02: {}, //someObject or you can require another module here
  Data03: {}, //someObject or you can require another module here
  ...
}

Затем переписайте свой код следующим образом

const Data = require('./data'); // assuming it is kept in same directory

//CREATE
router.post('/', (req, res, next) => {
  const source = req.body.source
  const schema = 'Data0' + source
  let { name, details, content, timestamp } = req.body
  Date[schema].create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})

Или, если вы уже сохранили все объекты данных в одном месте, вы можете использовать это

. Ключевым моментом здесь является только индексная запись для доступа к свойству объекта.

Чтение this для получения более подробной информации

Обновление

Вы обновили вопрос с помощью схемы данных, спасибо за это

Позвольте мне объяснить, что вы здесь делаете неправильно

//dataRoute.js

const express = require('express')
const Data01 = require('../models/Data01')
const Data02 = require('../models/Data02')
const Data03 = require('../models/Data03')

const router = express.Router()

//CREATE
router.post('/', (req, res, next) => {
  let { name, details, content, timestamp } = req.body
  Data0[req.body.source]
    .create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})

Здесь у вас есть три объекта Data01, Data02 и Data03.

И вы обращаетесь к нему вот так Data0[...], но у вас нет такой переменной, как Data0 вот почему вы получаете "ReferenceError: Data0 is not defined".

Так что вы можете это исправить, создав один общий объект данных, который будет иметь все ваши источники данных, подобные этому

const express = require('express')
const Data01 = require('../models/Data01')
const Data02 = require('../models/Data02')
const Data03 = require('../models/Data03')

const Data = {Data01, Data02, Data03} // created one single container object to hold all data sources.

const router = express.Router()

//CREATE
router.post('/', (req, res, next) => {
  let { name, details, content, timestamp } = req.body
  // Access property based on source from Data container
  const schema = 'Data0' + source
  Data[schema]
    .create({ name, details, content, timestamp })
    .then(data => {
      res.json({
        success: true,
        data,
      })
    })
    .catch(err => next(err))
})


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