带有 express/db.json 的 json-server 未反映更改

Posted

技术标签:

【中文标题】带有 express/db.json 的 json-server 未反映更改【英文标题】:json-server with express/ db.json is not reflecting changes 【发布时间】:2019-12-19 20:47:54 【问题描述】:

我们有一个简单的 json-server 设置,将它作为一个模块加载。 但是,当发出 POST/PUT 请求时,数据不会被注入到 db.json 中。

const jsonServer = require("json-server");
const source = require("./db.json");
const repl = require("replify");
const bodyParser = require("body-parser");
const paginationMiddleware = require("./middlewares/pagination");
const filterByAccessRightFor = require("./middlewares/filterByAccessRightFor");
const searchMiddleware = require("./middlewares/search");
const delayMiddleware = require("./middlewares/delay");
const createdAt = require("./middlewares/created_at");
const daterange = require("./middlewares/daterange");
const absence = require("./middlewares/absence");
const bankAccount = require("./middlewares/bankAccount");
const sort = require("./middlewares/sort");

const fileUpload = require("express-fileupload");

const withUser = require("./responseEnhancers/withUser");
const withAbsenceType = require("./responseEnhancers/withAbsenceType");
const withIndexData = require("./responseEnhancers/withIndexData");
const withNationalStateHolidayOverride = require("./responseEnhancers/withNationalStateHolidayOverride");
const withRoleRestrictions = require("./responseEnhancers/withRoleRestrictions");

const compose = require("lodash/fp/compose");
const initSickImagesEndpoint = require("./features/sicks/images/initEndpoint");
const initLoginEndpoint = require("./features/login/initEndpoint");
const path = require("path");
const express = require("express");

const createCalendarEntry = require("./_helpers/createCalendarEntry");

process.on("createCalendarEntry", createCalendarEntry);

const server = jsonServer.create();

const defaultMiddlewares = jsonServer.defaults(
  static: path.join(path.resolve(process.cwd()), "server", "files")
);

const router = jsonServer.router(source, 
  foreignKeySuffix: "_id"
);

router.render = (req, res) => 
  res = compose(
    withIndexData(req),
    withUser,
    withAbsenceType,
    withNationalStateHolidayOverride(req),
    withRoleRestrictions(req, db)
  )(res);

  res.jsonp(res.locals.data);
;

const db = router.db;

if (process.env.NODE_ENV === "production")
  server.use(express.static(path.join(__dirname, "../build")));

server
  .use(
    jsonServer.rewriter(
      "/de/*": "/$1"
    )
  )
  .use(bodyParser.json())
  .use(fileUpload())
  .use(defaultMiddlewares)
  .use(paginationMiddleware)
  .use(searchMiddleware)
  .use(delayMiddleware)
  .use(createdAt)
  .use(daterange)
  .use(absence)
  .use(bankAccount)
  .use(sort);

initLoginEndpoint(server, db);
initSickImagesEndpoint(server, db);

server.route("/sicks").all(filterByAccessRightFor(db));
server.route("/vacations").all(filterByAccessRightFor(db));

server.use(router);

server.listen(3001, "0.0.0.0", () => 
  console.log("JSON Server is running");
);

repl("db", server,  db );

exports.db = db;

module.exports = server;

这是我们的 index.js,除了 db.json 没有更新,一切都按预期正常工作。我们有一个为数据库播种的脚本,当通过 GET 访问资源时,会检索到正确的数据。 有什么想法吗?

【问题讨论】:

【参考方案1】:

您应该提供 json 文件的路径,而不是使用 require 为 db.json 文件提供 JSON 对象。

// const source = require("./db.json");
const source = path.join(__dirname, 'db.json')
const router = jsonServer.router(source, 
    foreignKeySuffix: "_id"
);

【讨论】:

感谢您的建议,已解决。根据github.com/typicode/json-server#module 的规范, jsonServer.router 方法接受路径或对象,因此会造成混淆! 嗨@Stepehn S 和 OP,您是如何引用您的数据库的?我试过 router.property_in_JSON 并返回未定义。 @MatthewFrancis 我认为应该是router.db.getState().property_in_JSON 是的!谢谢!我在帖子发布后几个小时就想到了哈哈

以上是关于带有 express/db.json 的 json-server 未反映更改的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Kotlin 的 Room 和 moshi 持久化带有 JSON 数组的 JSON 对象

带有 JSON 正文的 GET 方法和带有 RestTemplate 的承载授权

Python使用json加载解析带有两个json对象列表的文件

如何将带有 JSON 字符串的 Pandas DataFrame 转换为有效的 JSON?

带有 JSON 数组的 jQuery 'each' 循环

从 JSON 加载带有标题的表