• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

operation not permitted, rename 에러에 대해 질문드리고 싶습니다

22.03.26 21:00 작성 조회수 243

0

강사님 안녕하세요

비동기 함수와 await을 조합해서

아래의 소스코드를 실험해봤는데, 이해가 어려운 부분이 있어서 질문드리고 싶습니다

 const fs = require('fs');
 const path = require('path');
 
function func(){
 fs.open(`.\\b.txt`, 'w', (err, fd)=>{
        if(err)
        { //실패한 경우
           throw err;
        }//성공한 경우
    });
    fs.rename(`.\\b.txt`, `.\\c.txt`,(err,data)=>{
        if(err) 
        {
            throw err;
        }
        });
  fs.writeFile(`.\\c.txt`, `Hello   `, (err)=>{
            if(err)
            {
                console.log(err);
            }
        });
}

func();

 

터미널에서 실행시켰습니다

이렇게 c.txt가 잘 만들어졌습니다

 

 

이번엔 18행부터 24행의 주석을 풀었습니다

 

 

그러자, 이번에는 같은 소스코드인데도

실행결과가 성공이 나오기도 하고, 실패하기도 했습니다

실행 성공 했을 때는 c.txt 에도 Hello 가 잘 적혔습니다

 

주석을 해제한 소스코드를

디버깅 모드에서 한줄씩 실행할 때는 무조건 성공이었는데

터미널 또는 vscode에서 한번에 실행시키면 이렇게 실행결과가 복불복이 나와서

혹시 그 이유가 궁금해서 질문드리고 싶습니다

읽어주셔서 감사합니다

 

답변 1

답변을 작성해보세요.

0

앞 함수가 끝나기 전에 뒷 함수가 실행되면 저렇게 에러가 뜹니다. b.js를 여는 작업 중에 b.js 이름을 바꾸려해서 그렇습니다.

아 제가 실수로 소스코드를 잘못 올려드린 것 같습니다

소스코드를 잘못 올려드려서 번거롭게 해드려서 죄송합니다

원래 질문드리려던 소스코드는 이러했습니다

 

이렇게 async await으로 비동기 함수를 동기화 시켜줬는데도
터미널에서 10번 정도 실행시켜보면
랜덤으로 정상 실행 되기도 하고
랜덤으로 같은 에러가 생기기도 했습니다


비동기 함수를 async await으로 동기화 시켜줘도
똑같은 operation not permitted, rename  에러가 생겼습니다

 

const fs = require('fs');
 const path = require('path');
 
async function func(){
 await fs.open(`.\\b.txt`, 'w', (err, fd)=>{
        if(err)
        { //실패한 경우
           throw err;
        }//성공한 경우
    });
 await fs.rename(`.\\b.txt`, `.\\c.txt`,(err,data)=>{
        if(err) 
        {
            throw err;
        }
        });
 await fs.writeFile(`.\\c.txt`, `Hello   `, (err)=>{
            if(err)
            {
                console.log(err);
            }
        });
}

func();

 

1. 혹시 제가 async await을 잘못써서 
비동기함수들을 차례대로 실행을 못시킨건지 질문드리고 싶습니다

2. 그게 아니면,  await 덕분에 비동기 함수들이 차례대로 실행이 되었는데도,
함수마다 실행 완료되는 시간이 다 달라서, 
먼저 실행된 fs.open 함수가 아직 안끝났는데, 뒤의 함수인 fs.writeFile 함수가 실행이 되어서 그런건지 질문드리고 싶습니다

await은 프로미스에 붙여야 의미있습니다. 저 함수는 콜백 기반이지 프로미스가 아닙니다.

실험을 해봤는데
2번째 이유가 맞는 것 같았습니다

일부러 넉넉하게 시간의 간격을 줬더니, 

그 이후로는 아주 잘 실행되었습니다

혹시

2번째 이유인
await 덕분에 비동기 함수들이 차례대로 실행이 되었는데도,
함수마다 실행 완료되는 시간이 다 달라서, 
먼저 실행된 fs.open 함수가 아직 완전히 안끝났는데, 뒤의 함수인 fs.writeFile 함수가 실행이 되어서 그런거라는 추측이 맞는지 질문드리고 싶습니다

결국, async await은 비동기 함수의 실행순서만 동기화 시켜주고

순차적으로 실행이 되더라도, 완료는 순차적으로 되지 않았기에, 발생했던 문제라는 생각이 들었습니다

 

 

앗, 중간에 댓글로 답변해주신 게 안보여서 연속으로 댓글을 적었는데, 다시 확인해보니, 중간에 답변을 달아주셨었네요

이렇게 늦은 시간에도 답변해주셔서 감사합니다

이렇게 promise와 await을 붙여서 수정해봤는데,
이래도 실행할 때마다

랜덤으로

같은 에러가 생기거나, 정상 작동인 것을 보면

싱크가 제각각인 것 같습니다

 

혹시 제가 아예 await 개념을 잘못 이해하고 있는건지 질문드리고 싶습니다

그런 거면, 다시 처음부터 공부하려구요

 

 const fs = require('fs');
 const path = require('path');
 

async function func(){
    
new Promise((resolve,reject)=>{
    resolve('Test');
})
 await fs.open(`.\\b.txt`, 'w', (err, fd)=>{
        if(err)
        { //실패한 경우
           throw err;
        }//성공한 경우
    });
 await fs.rename(`.\\b.txt`, `.\\c.txt`,(err,data)=>{
        if(err) 
        {
            throw err;
        }
    });
 await fs.writeFile(`.\\c.txt`, `Hello   `, (err)=>{
            if(err)
            {
                console.log(err);
            }
     });
}


func();

 

이렇게 바꿔도 실행결과가 복불복이네요 다르게도 바꿔보겠습니다

아예 프로미스에 대한 이해가 없으신 상태라서 설명을 드려도 이해하시기 어려울 것 같습니다. 마지막 코드도 엉터리 코드입니다. 그리고 애초에 fs는 promise를 지원하는 fs함수들이 따로 있습니다. 강좌에서도 나오고요.

예제의 실행결과에서 규칙을 찾으려고 하지 마시고 규칙을 먼저 배운 후에 예제가 그 규칙대로 돌아가는지 보셔야합니다. 지금은 예제의 결과를 자의적으로 해석해서 전혀 다른 규칙을 만들어내고 계신 겁니다.

fs. sync함수는 동기함수이고요. fs.promise가 따로 존재합니다.

async await을 다시 처음부터 공부해야겠습니다

그리고 마지막 소스코드 resolve( )를 빼먹었었네요

fs.promise 라는 문법도 몰랐었는데 가르쳐주셔서 감사합니다

오늘 10시에 비동기편 라이브하니 그것 챙겨보셔도 좋을것 같습니다.

오늘 유튜브 라이브 하시는군요. 네 챙겨보겠습니다

아 아마도 이해한 것 같습니다 ㅎㅎ 갑자기 기쁨의 웃음이 절로 나오네요
가르쳐주신 변환공식으로 인터넷의 더 많은 예시들을 변환해보고 파해쳐보니, 감이 잡히는 것 같습니다
그래도 혹시 알고 있다고 착각한 부분이 있거나, 모르는 게 있을 수 있으니 유튜브 강의 감사히 듣겠습니다