nodejs+koa 写入文件请求,后续的请求502是什么原因?

save_upload_resource(ctx) {
    const { key, url, type } = ctx.request.body
    try {
      const dataStr = fs.readFileSync('./app/data/upload_resource.txt', 'utf-8')
      const data = dataStr ? JSON.parse(dataStr) : []
      data.push({ key, url, type })
      fs.writeFileSync('./app/data/upload_resource.txt', JSON.stringify(data))
      // 排查后发现, 如果把这一段注释掉,就没有问题,所以初步断定问题就是出在了写入操作这, 但是不知道怎么解决
      ctx.body = successBody()
    } catch (err) {
      ctx.body = errBody
    }
  }

这是我在koa项目中实现的一个post请求,功能是读取本地文件并写入数据, 在前端调用axios.post去请求这个api的时候,除了第一次一定成功外,如果操作的快一点的话,后续的请求就全部502了, 这是什么原因,请求如何解决?

fs.writeFileSync('./app/data/upload_resource.txt', JSON.stringify(data))
// 排查后发现, 如果把这一段注释掉,就没有问题,所以初步断定问题就是出在了写入操作这, 但是不知道怎么解决

image.png

阅读 2.6k
1 个回答

js 是单线程,xxxSync 是同步操作,相当于单线程被占用,后续当然会出错。

所以 node.js 从诞生起,安身立命之本就是异步操作。此处换用 writeFile 应该可解,不过建议用 promise 版本,配合异步函数,大概如下:

const {writeFile} = require('fs/promises');

async save_upload_resource(ctx) {
  ...
  await writeFile('./app/data/upload_resource.txt', JSON.stringify(data))
  ...
}

写代码不要只选好写的方案,要选正确的方案。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏