2016-12-28 58 views
3

由於我似乎無法解決這個問題,因此我需要大量的時間來調用這個大槍。
我在Node中有一個簡單的CRUD API。我在前端使用EJS。基本上,我有一個selectAllRecords視圖,其中顯示所有記錄的表格。我在每條記錄旁邊都有一個按鈕來編輯記錄。點擊該按鈕後,它將重定向到editrecord.ejs頁面,點擊API查看單個記錄,其中每行顯示爲輸入框中的值。從那裏,我有一個XMLHttpRequest的onclick方法提出更新數據庫的請求。然而,我收到一個錯誤 - 500 (Internal Server Error) - 我確定這是一個相當簡單的東西,我錯過了,但我似乎無法弄清楚。NodeJS更新API - 內部服務器錯誤

任何幫助,非常感謝!下面的代碼:

首先對我的看法:

<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文件:

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( )函數,開發工具日誌顯示一個PUT請求'api/edit/50'(或任何ID)和'500(內部服務器錯誤)' - 如果我硬重新加載'getAllRecords'視圖,更新反映如此這是渲染或重定向的問題(我已經試過)

編輯

至於建議,我刪除從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循環。數據庫確實更新了。 – jsw324

回答

1

您發送一個Ajax請求,以更新記錄。因此,您不應該嘗試將render視圖或redirect用戶作爲此請求的響應。相反,您可以發回一個帶有一些屬性的JSON對象,例如「狀態」。

然後在客戶端,檢查返回的JSON響應,並根據「status」參數(或您選擇的任何其他參數),您可以更新數據或使用客戶端上的window.reload重新加載頁面。

+0

所以我改變了updateCandidate方法來返回一個JSON響應,但我仍然得到相同的500內部服務器錯誤。它可能是一個權限問題?我的開發控制檯向我展示了PUT請求正在打到正確的URL,所以我真的爲此失去了爲什麼這不能正常運行。這裏是更新的代碼 – jsw324

+0

它太長了我會將它添加到原來的文章 – jsw324

+0

@ jsw324您可以在瀏覽器的控制檯中通過單擊firefox中的500錯誤消息或轉到網絡選項卡然後單擊相關來檢查詳細的錯誤消息在Chrome中請求。對我來說,由於使用未定義的變量等而發生這樣的500錯誤。 –

0

您的數據庫查詢說

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