2017-05-08 1 views
0

나는 서버를 작성하고 있으며 게시 할 때 req.body를 fs가있는 파일에 저장합니다.Nodejs가 지속적으로로드하는 중

제출시 클라이언트 페이지가 계속로드되며, 쓰기 파일이 비동기 적이어야하는지, 그렇다면 콜백이 어떻게 보이고 페이지가 여전히로드되어 있어야합니다.

app.post('/', function(req,res) { 
    console.log(req.body) 
    fs.writeFileSync('data.txt', JSON.stringify(req.body)) 
}) 

응답을 보내지 않았습니까?

+0

좋아, 응답을 보내고 비동기 함수로 변경하면 내 서버가 개선 될 것입니까? – Sprout

+0

예. 하나는 서버가 요청을 처리하는 것을 클라이언트에 알리고, 다른 하나는 전체 서버에 대해 거대한 병목 현상이되지 않도록 경로를 방지합니다. –

+0

그래서 응답을 보내면 다른 페이지로 바뀌므로 응답을 보내고 싶지만 같은 페이지에 머물러 있습니다. 그게 가능하니? – Sprout

답변

2

예, 응답을 보내지 않았기 때문입니다. Express는 자동으로 응답을 보내지 않으므로 해당 엔드 포인트에 게시 할 때 응답을 리턴해야합니다. 그렇지 않으면 요청이 중단됩니다.

파일 쓰기가 비동기 일 필요는 없지만 반드시 수행해야합니다. 이 작업을 수행하는 현대적인 방법은 ... 약속, 같은 뭔가를 사용하는 것입니다

new Promise(function(resolve, reject) { 
    fs.writeFile('data.txt', JSON.stringify(req.body), (err) => 
    { 
     if (err) reject(err); 
     else resolve(data); 
    } 
}).then(
    (success) => res.send(success) 
).catch(
    (err) => { 
     console.log(err); 
     res.status(500).send(); 
    } 
); 

당신은 (당신이 낮은 성능의 사이트의 경우에 필요하지 않습니다) 비동기를하지 않으려면 do :

app.post('/', function(req,res) { 
    console.log(req.body) 
    fs.writeFileSync('data.txt', JSON.stringify(req.body)) 
    res.send({"status": 200}); 
}) 
1

응답을 보내지 않고 코드를 작성하는 것이 좋습니다. 응답을 보내거나 res.end()을 수동으로 호출하여 연결을 종료하지 않으면 서버가 중단되고 요청하는 클라이언트가 시간 초과됩니다.

res.send()을 호출하면 연결이 종료되고 클라이언트에 응답을 보내 적어도 요청 상태를 알립니다.

문자열을 다시 보내면 페이지가 다시로드되지 않아야합니다.

app.post('/', function(req,res) { 
    console.log(req.body) 
    fs.writeFileSync('data.txt', JSON.stringify(req.body)) 
    // Set status code to 200, send string response 
    res.status(200).send('Ok'); 
})