Node / Express - использовать ответ API JSON для (серверной) визуализации приложения - PullRequest
0 голосов
/ 07 апреля 2019

Преамбула: я новичок в веб-разработке, так что, возможно, это может быть очень простой вопрос для вас.

Я использую шаблон архитектуры MVC для этого базового приложения.У меня есть модели (MongoDB), представления (Express Handlebars) и контроллеры (функции, которые принимают req, res, next и возвращают обещания (возвращается .then> JSON, возвращается ошибка .catch>). Я буду маршрутизироватьпути требуют соответствующих конечных точек API в контроллерах.

Это имеет смысл (верно?), когда я просто работаю над вызовами API, где JSON является рез. Однако я также хочу вызывать эти конечные точки API> получить их res.json> и использовать его для рендеринга моего HTML-кода с помощью Handlebars. Каков наилучший способ сделать это? Я могу создать такие же контроллеры и вместо того, чтобы быть JSON, я могу сделать render ("html view", res.json). Но кажется, что я повторяю тот же код снова, чтобы изменить то, что делать с ответом (вернуть JSON или Render the JSON).

Надеюсь, что если я не имею смысла, то давайтея знаю. Пожалуйста, сообщите.

ps попробуйте ELI5 вещи для меня. (:

Редактировать:

//Model Example
const Schema = require('mongoose').Schema;

const testSchema = new Schema({
    testText: { type: String, required: true },
});

const Test = mongoose.model('Test', testSchema);

module.exports = Test;


//Controller Example
const model = require('../models');

module.exports = {
    getAll: function(req, res, next) {
        model.Test.find(req.query)
            .then((testItems) => {
                !testItems.length
                    ? res.status(404).json({ message: 'No Test Item Found' })
                    : res.status(200).json(testItems);
            })
            .catch((err) => next(err));
    },
};

//Route Example
const router = require('express').Router(),
    controller = require('../controllers');

router.get('/', controller.getAll);

module.exports = router;

Я хочу, чтобы конечные точки возвращали JSON и каким-либо образом управлять,сделать (если рeq поступает из браузера) или остается с JSON (если вызывается, например, из Postman или веб-URL API) без повторения кода.Я пытаюсь не создавать две конечные точки с 99% кода, которые являются одинаковыми, с той лишь разницей, что .then> res.status (200) .json (testItems);vs .then> res.status (200) .render ('testPage', {testItems}).

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Если вы хотите перейти с checking postman token, вы можете использовать аналогично method1.

, если вы хотите проверить с помощью параметров запроса, в этом случае вы можете получить json ответ или HTML даже избраузер для будущего использования также и не зависит от почтальона, тогда используйте аналогично method2 из следующего примера.

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
const port = 5000



app.get('/method1', (req, res) => {
  const isJSONResp = req.headers['postman-token']
  const resp = { status: "hello" }
  if (isJSONResp) {
    res.json(resp)
  } else {
    res.render('some.html', resp)
  }
})

app.get('/method2', (req, res) => {
  const params = req.params
  const resp = { status: "hello" }
  if (params.resp === 'json') {
    res.json(resp)
  } else {
    res.render('some.html', resp)
  }
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))
0 голосов
/ 07 апреля 2019

Для почтальона вы можете проверить наличие postman-token в req.headers, затем вы можете отрендерить соответственно, что-то вроде этого:

req.headers['postman-token'] ? res.json({ /* json */ }) : render('view', {/ * json */});
...