2017-11-20 6 views
1

개발자가 express.js 응용 프로그램을 개발할 수있는 IDE를 개발 중입니다. 따라서 개발자는 새로운 급행 응용 프로그램을 만들 수 있습니다. 리소스 소비가 중요하기 때문에 각 익스프레스 앱을 별도의 프로세스로 실행하고 싶지는 않습니다. 사실 그들은 모두 주 프로세스에서 node.js 모듈로 실행됩니다. 이제 문제는 코드 개발자가 어떤 코드를 작성할 것인지 전혀 모른다는 것입니다. 예를 들어 setInterval과 같은 함수를 사용하는지 여부는 알 수 없습니다.setInterval을 포함하여 모든 기능을 포함하는 nodejs 모듈을 완전히 제거하는 방법?

이 주 프로그램입니다 가정 : 나를 조금 더 설명하게

'use strict' 

const mainApp = require('express')(); 

require('./userModule.js')(); 

mainApp.delete('/', function(req, res){ 
    /* 
    What should I do here to delete the user code? 
    */ 
    res.status(202).send('deleted'); 
}); 

mainApp.listen(8000,() => console.log('Example app listening on port 8000!')) 

그리고 이것은 userModule.js 기능에 사용자가 작성한 코드입니다 : 내가 이미 알고

'use strict' 

module.exports = function(){ 

    // code written by user will come below 

    setInterval(function(){ 
    console.log('hello!!!'); 
    }, 3000); 

    // code written by user will come above 

} 

다음 :

1- 설명 된대로 모듈 캐시를 삭제하십시오. here. 그건 도움이 안돼.

delete require.cache[require.resolve('./userModule.js')]; 

2 - 설명 된대로 ID가 알려지지 않은 경우 ClearInterval here. 나는 모든 간격을 지우고 싶지 않다! 또한 setInterval 함수에서만 작동합니다.

모듈이 주 프로세스에서 실행중인 경우 옵션이 없다는 사실에 도달했습니다. 내가 맞습니까?

답변

1

그리고 global (global.foo = 42 또는 그와 비슷한 것)으로 할당하여 전역 변수를 설정할 수 있다는 것을 잊지 마십시오. 그리고 글로벌이 만들어지면 누가 그것을 만들었는지, 그리고 그걸 제거해야하는지는 알 수 없습니다.

예, 노드 모듈을 완전히 정리할 수 없습니다.

절대적으로 긍정적 인 태도로 모두 동일한 프로세스에서 실행하지 마십시오.

각 저자와 모든 저자를 신뢰하지 않는 한 별도의 프로세스로 생성하더라도 사용자가 제공 한 코드를 실행할 수는 없습니다. 자신을 보호하기 위해 더 많은 일을 할 필요가 있습니다 (chroot jails, 그런 종류의 일). 자신을 보호하기 위해해야 ​​할 일의 전체 목록은 SO 질문/답변에 너무 광범위합니다.

다시 한 번 기본 대답은 다음과 같습니다. 네, 맞습니다. 일단로드 된 노드 모듈을 완전히 정리할 수는 없습니다. 프로세스에 코드를로드하지 마십시오.