首页 > 解决方案 > node.js同时修改response和store request

问题描述

所以我想做的是在我的 json-server 有请求时手动覆盖响应。我对此很好,但我不知道如何添加一点也将原始请求存储在数据库中。

这是我的代码(我将来自请求和静态 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();
    }
}

标签: node.jsjson-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。

服务器.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": []
}

现在我们可以 POST 到我们的http://localhost:3000/business端点并将我们的请求正文保存到我们的数据库中。但是,我们不能修改 201 状态,也不能将请求正文修改为其他内容。

选项 2。

服务器.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 返回。


推荐阅读