2016-12-28 2 views
3

시간이 지나면 큰 총을 불러내 어서 알아낼 수 없습니다.
노드에 간단한 CRUD API가 있습니다. 프론트 엔드에서 EJS를 사용하고 있습니다. 본질적으로 모든 레코드 테이블을 표시하는 selectAllRecords보기가 있습니다. 레코드를 편집하려면 각 레코드 옆에 단추가 있습니다. 버튼을 클릭하면 editrecord.ejs 페이지로 리디렉션되고 각 레코드가 입력란에 값으로 표시되는 단일 레코드의 API에 도달합니다. 거기에서, 나는 XMLHttpRequest가 데이터베이스를 갱신하라는 요청을하는 onclick 메소드를 가지고있다. 그러나 오류가 발생합니다. 500 (Internal Server Error) - 실종 된 것은 매우 간단합니다.하지만 그 사실을 알 수는 없습니다.NodeJS 업데이트 API - 내부 서버 오류

도움을 주시면 대단히 감사하겠습니다. 아래 코드 : I 업데이트 버튼을 쳤을 때,

function updateCandidate(req, res, next) { 
    var candID = parseInt(req.params.id); 
    console.log('hit update'); 
    console.log('name ' + req.body.name); 
    db.none('update cands set name=$1, email=$2 where id=$3', 
    [req.body.name, req.body.email, candID]) 
    .then(function() { 
     var candID = candID 
     var name = data.name; 
     var email = data.email; 
     res.render("edited", {"candID":candID, "name":name, "email":email}); 
    }) 
    .catch(function (err) { 
     return next(err); 
    }); 
} 

잠재적으로 중요한 점과합니다 (someFunc을 실행

<script type="text/javascript"> 
function someFunc() { 
    var id = <%= id %>; 
    var url = '/api/edit/' + candID; 
    console.log('url ' + url); 
    var name = document.getElementById("name").value; 
    var email = document.getElementById("email").value; 

    var data = { 
     name: name, 
     email: email, 
    } 
    var json = JSON.stringify(data); 
    console.log('json ' + json); 
    var xhr = new XMLHttpRequest(); 
    xhr.open("PUT", url, true); 
    xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8'); 
    xhr.send(json); 
}; 

내 queries.js에

가 파일 : 내보기에

우선) 함수에서 dev 툴 로그는 'api/edit/50'(또는 ID가 무엇이든) 및 '500 (내부 서버 오류)'에 대한 PUT 요청을 보여줍니다. - 'getAllRecords'보기를 하드로드하면 업데이트가 반영됩니다. 렌더링 또는 리디렉션 문제 (둘 다 시도했습니다)

,363,210

수정 제안으로

, 나는이 updateCandidate 방법에서 렌더링 제거,하지만 난 여전히 500 내부 서버 오류가 발생합니다. devtools는 PUT 요청이 올바른 URL을 치고 있다는 것을 보여 주므로이 기능이 올바르게 작동하지 않는 이유를 잘 모릅니다. 아래의 업데이트 코드 ...

function updateCandidate(req, res, next) { 
var candID = parseInt(req.params.id); 
db.none('update cands set name=$1, email=$2, client=$3, jobtitle=$4, question1=$5, question2=$6, question3=$7 where id=$8', 
[req.body.name, req.body.email, req.body.client, 
    req.body.jobtitle, req.body.question1, req.body.question2, req.body.question3, candID]) 
.then(function (data, err) { 
    res.status(200) 
    .json({ 
     status: 'success', 
     message: `Edited Candidate` 
    }); 
}) 
.catch(function (err) { 
    return next(err); 
}); 
} 
+1

우편 배달부와 같은 도구로 API를 테스트 했습니까? – kkreft

+0

무엇이 오류입니까? – aug2uag

+0

나는 CURL 요청으로 테스트를했는데 기능적으로 잘 작동하는 for 루프에 대해 완전히 관련없는 페이지에서 이상한 오류가 발생했습니다. db가 업데이트되었습니다. – jsw324

답변

1

이어야한다 말한다. 따라서 render보기 또는 redirect 사용자를이 요청의 응답으로해서는 안됩니다. 대신 JSON 객체를 몇 가지 속성과 함께 다시 보낼 수 있습니다. "지위".

클라이언트 측에서는 반환 된 JSON 응답을 확인하고 "상태"매개 변수 (또는 선택한 다른 옵션)를 기반으로 클라이언트 측에서 window.reload을 사용하여 데이터를 업데이트하거나 페이지를 다시로드 할 수 있습니다.

+0

그래서 updateCandidate 메소드를 JSON 응답을 반환하도록 변경했지만 여전히 동일한 500 내부 서버 오류가 발생합니다. 사용 권한 문제 일 수 있습니까?내 dev 콘솔은 PUT 요청이 올바른 URL을 치고 있다는 것을 보여 주므로이 기능이 올바르게 작동하지 않는 이유에 대한 손실이 발생했습니다. 다음은 업데이트 된 코드입니다 – jsw324

+0

너무 길어 원래 게시물에 추가 할 것입니다 – jsw324

+0

@ jsw324 firefox에서 500 오류 메시지를 클릭하거나 네트워크 탭으로 이동 한 다음 관련성을 클릭하여 브라우저의 콘솔에서 자세한 오류 메시지를 확인할 수 있습니다 Chrome에서 요청 나를 위해, 그러한 오류는 정의되지 않은 변수 등을 사용하여 발생합니다. –

0

귀하의 DB 쿼리

db.none('update cands set name=$1, email=$2 where id=$8', [req.body.name, req.body.email]) ... 

가되지는 당신은 레코드를 업데이트하는 아약스 요청을 보내는

db.none('update cands set name=$1, email=$2 where id=$8', [req.body.name, req.body.email, candID]) 
+0

죄송합니다. 예, 원래 코드에서 그렇게 말합니다. 나는 간소화를 위해 일부 필드를 자르고 실수로 candID를 제거했습니다. 변경 사항을 반영하도록 편집되었습니다. – jsw324