node.js изменяет ответ и сохраняет запрос одновременно - PullRequest
0 голосов
/ 21 февраля 2019

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

Вот мой код (я отправляю в качестве ответа имя из запроса и статический UUID)Следующий();если шаг терпит неудачу, он не может установить заголовки.

module.exports = (req, res, next) => {

    if (req.path == "/business") {
        res.status(201);

        res.jsonp({
            id: "a23e1b13-cf69-461c-aa8a-a0eb99e41350",
            name: req.body['name'],
            revision: "1"
        });

        next();
    }
    else {
        next();
    }
}

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вы правы.

Например, мы не можем:

server.js

const jsonServer = require("json-server")
const server = jsonServer.create()
const router = jsonServer.router("db.json")

server.use(jsonServer.defaults())
server.use(jsonServer.bodyParser)

server.use((req, res, next) => {
  if (req.method === "POST" && req.url === "/business") {
    res.status(201)
    res.jsonp({
      id: "a23e1b13-cf69-461c-aa8a-a0eb99e41350",
      name: req.body["name"],
      revision: "1"
    })
  }
  next()
})

server.use(router)
server.listen(3000, () => {
  console.log("JSON Server is running")
})

Или мы получаем: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the clientкогда мы запускаем node server.js, потому что мы уже установили и отправили заголовки при вызове res.jsonp, поэтому мы не можем сделать это снова, вызвав server.use(router).

У нас есть пара вариантов.

Вариант 1.

server.js

const jsonServer = require("json-server")
const server = jsonServer.create()
const router = jsonServer.router("db.json")

server.use(jsonServer.defaults())

server.use(router)
server.listen(3000, () => {
  console.log("JSON Server is running")
})

db.json

{
  "business": []
}

Теперь мыможет отправить в нашу конечную точку http://localhost:3000/business и сохранить тело запроса в нашей базе данных.Однако мы не можем изменить статус 201 или тело запроса на что-то другое.

Вариант 2.

server.js

const jsonServer = require("json-server")
const server = jsonServer.create()

server.use(jsonServer.defaults())
server.use(jsonServer.bodyParser)

server.post("/business", (req, res, next) => {
  res.status(201)
  res.jsonp({
    id: "a23e1b13-cf69-461c-aa8a-a0eb99e41350",
    name: req.body["name"],
    revision: "1"
  })
  next()
})

server.listen(3000, () => {
  console.log("JSON Server is running")
})

Теперь мы получаем правильный ответ, но мы больше не можем сохранить в нашей базе данных ключ business, потому что мы вызываем server.post("/business"...

Однако вы можете использовать это в своем собственном коде и сохранить его где-нибудь еще (илинаписать в вашу собственную базу данных), так как этот ответ будет возвращен из Promise.

0 голосов
/ 21 февраля 2019

Если вы хотите передать данные из промежуточного программного обеспечения на любые маршруты, вы можете присвоить значение с помощью объекта req, а не объекта res.

app.use(function(req.res)) {
    req.custom_data = {
            id: "a23e1b13-cf69-461c-aa8a-a0eb99e41350",
            name: req.body['name'],
            revision: "1"
        };
next();
}

Из другого места вы можете сделать это следующим образом.

module.exports = (req, res, next) => {
res.jsonp(req.custom_data)//something like this
}

Это может помочь тебе.

...