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))
// 排查后发现, 如果把这一段注释掉,就没有问题,所以初步断定问题就是出在了写入操作这, 但是不知道怎么解决
js 是单线程,
xxxSync
是同步操作,相当于单线程被占用,后续当然会出错。所以 node.js 从诞生起,安身立命之本就是异步操作。此处换用
writeFile
应该可解,不过建议用 promise 版本,配合异步函数,大概如下:写代码不要只选好写的方案,要选正确的方案。