Node.js中使用json-server,如何等待POST数据写入后执行函数?
解决json-server POST数据持久化后再执行函数的问题
这个问题我之前也碰到过,核心原因是json-server处理POST请求的文件写入是异步操作——你在中间件里直接调用startCol.masterProc()的时候,数据还没真正写到文件里,自然会出现函数提前执行的情况。下面给你两个靠谱的解决方案:
方案1:自定义POST路由,确保写入完成后执行函数
这个方案最精准,只针对你需要的POST请求做处理,步骤如下:
- 覆盖json-server默认的POST路由,先让它完成数据写入逻辑
- 等写入完成后,再调用你的
masterProc函数
代码示例:
const jsonServer = require('json-server'); const server = jsonServer.create(); const router = jsonServer.router('db.json'); const middlewares = jsonServer.defaults(); server.use(middlewares); server.use(jsonServer.bodyParser); // 必须确保解析请求体 // 替换成你实际的接口路径,比如/posts server.post('/posts', async (req, res) => { // 用Promise包裹router的处理逻辑,确保写入完成 await new Promise((resolve) => { router.handle(req, res, () => { // router处理完写入后,resolve这个Promise resolve(); }); }); // 此时数据已经100%持久化到JSON文件了 startCol.masterProc(); }); server.use(router); server.listen(3000, () => { console.log('JSON Server running on port 3000'); });
方案2:监听lowdb的写入完成事件
json-server底层用lowdb做数据存储,我们可以直接监听lowdb的write事件,这个事件会在数据真正写入文件后触发。如果需要只针对POST请求执行,还可以结合请求方法判断:
代码示例:
const jsonServer = require('json-server'); const server = jsonServer.create(); const router = jsonServer.router('db.json'); const middlewares = jsonServer.defaults(); server.use(middlewares); // 获取json-server使用的lowdb实例 const db = router.db; // 记录当前请求的方法 let currentRequestMethod = ''; // 先通过中间件记录请求方法 server.use((req, res, next) => { currentRequestMethod = req.method; next(); }); // 监听lowdb的写入完成事件 db.on('write', () => { // 只在POST请求后执行masterProc if (currentRequestMethod === 'POST') { startCol.masterProc(); } }); server.use(router); server.listen(3000, () => { console.log('JSON Server running on port 3000'); });
方案对比
- 方案1:精准控制特定路由的POST请求,不会干扰其他操作(比如PUT/PATCH)
- 方案2:全局监听所有数据写入操作,适合需要在任何数据变更后执行函数的场景
内容的提问来源于stack exchange,提问作者user2405589
相关产品推荐
相关产品推荐

