2013-03-04 5 views
2

저는 NodeJS로 서버 측 JavaScript를 탐색하고 ExpressJS로 REST API를 작성하고 있습니다. 내 REST API는 가정용 라우터를 구성하는 것과 마찬가지로 장치를 구성하기위한 것입니다. 여러 개의 비 구성 요청을 방지하지 않고 클라이언트를 구성하려고 시도하는 병렬 REST 호출을 방지하고 싶습니다.NodeJS를 직렬화하는 방법은 무엇입니까?

예 API 자원 : 다른 클라이언트가 다른 클라이언트가 쿼리를 허용하면서, 파일 시스템 리소스를 구성하는 동안

내 예를 들어, API에서
/api/config/network 
/api/config/filesystem 

는 개념적으로 내가 하나의 클라이언트가 네트워크 리소스를 구성 할 수 있도록하고 싶습니다 그 자원들.

JavaScript를 사용하여 비동기 프로그래밍 모델을 구현하는 방법을 잘 모르겠습니다. 비동기 프로그래밍 배경 (멀티 스레드 C++)에서 왔습니다. 이 문제를 해결하기 위해 머리를 감싸는 데 어려움을 겪고 있으며이 문제를 직접 해결할 수있는 방법을 궁금해합니다. 플러그인/모듈을 작성해야한다면 어떻게해야합니까?

+1

https://github.com/caolan/async와 같이이를 처리하는 데 도움이되는 라이브러리가 있습니다. – bfavaretto

+1

아직 어떤 것을 시도해 보셨습니까? 누군가가 이미 시도한 것을 보여주는 코드를 게시 할 때 도움을주는 것이 일반적으로 훨씬 쉽습니다. – tkone

+0

@tkone 내 문제는 무엇을 시도해야할지 모르겠습니다. – snowballhg

답변

8

익스프레스 앱이 구성 편집 요청을 받으면 동시성이 1로 구성된 async.js queue에 항목을 추가하십시오. 이렇게하면 원격 구성을 편집하려는 동시 시도가 1 번 이상 발생하지 않습니다. 의사 코드는 다음과 같습니다

  • 는 응용 프로그램 시작시,/1
    • var networkQueue = async.queue(updateNetworkConfig, 1);
  • REST 같은 PUT에서 제공 동시성의 큐를 생성, 응용 프로그램을 시작할 때 당신의 updateNetworkConfig 기능
  • 을 정의 JSON의 요청 본문으로 새 구성을 사용하는 api/config/network
  • 새 구성 데이터를 전달하는 항목을 대기열에 추가합니다 (bodyParser에서 제공 req.body 연결하는 미들웨어) 16,
    • networkQueue.push(req.body.config);
  • 반복 각각의 독립적 인 설정을위한 설정 : 당신은 다른 배관의 무리가 필요합니다

파일 시스템 등 콜백을 처리하고 구성이 저장되었을 때 REST 클라이언트에 알릴 수 있습니다. 대기열이 비어 있지 않은 경우 전화를 대기 또는 새 통화 거부 여부를 결정합니다.

비동기 프로그래밍으로 유창성을 높이고 귀중한 것을 가르쳐주는 멋진 async.js 라이브러리를 배우고 사용하지 않으려 고하기 때문에 여기에 나와 있습니다. 변수라는 것을 사용하십시오.

var updatingNetwork = false; 
app.put('/api/config/network', function (req, res) { 
    if (updatingNetwork) { 
     return res.status(409).send("Try later"); 
    } 
    updatingNetwork = true; 
    updateNetworkConfig(req.body.config, function (error) { 
     updatingNetwork = false; 
     if (error) { 
      return res.status(500).send(error); 
     } 
     res.status(200).send("done"); 
    }); 
}); 
  • 요청이 updatingNetwork에 해당하는 경우, 당신은 과정에서 업데이트가 이미 알고, 하나이 일을 대기하거나 거부에서 제공

    .
+0

이것은 async.js로 어떻게 할 수 있었는지에 대한 좋은 대답이지만, async.js 나 다른 라이브러리없이 이것을 해결하기 위해 어떤 방법을 적용 할 수 있습니까? – snowballhg

+0

놀라운 게시물 선생님 :) – snowballhg

관련 문제