2016-12-28 17 views
3

私はそれを把握しているように見えないので、これについては大きな銃を呼び出す頃です。
私はノードに単純なCRUD APIを持っています。私はEJSをフロントエンドで使用しています。本質的に、私はすべてのレコードのテーブルを表示するselectAllRecordsビューを持っています。レコードを編集するために各レコードの横にボタンがあります。ボタンをクリックするとeditrecord.ejsページにリダイレクトされ、各行が入力ボックスに値として表示される単一レコードのAPIが表示されます。そこから、XMLHttpRequestでデータベースを更新するためのput要求を行う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を実行します( )関数では、devツールログに 'api/edit/50'(または何らかのID)と '500(内部サーバーエラー)'というPUTリクエストが表示されます。 - 'getAllRecords'ビューをハードリロードした場合、それはレンダリングまたはリダイレクトの問題です(私は両方を試しました)

EDIT

示唆したように、私は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レスポンスをチェックし、 "status"パラメータ(または選択したもの)に基づいて、クライアントサイドでwindow.reloadを使用してデータを更新するか、ページをリロードすることができます。

+0

私はJSONレスポンスを返すようにupdateCandidateメソッドを変更しましたが、私はまだ同じ500 Internal Server Errorを取得しています。権限の問題である可能性がありますか?私の開発コンソールはPUT要求が正しいURLに当たっていることを私に示しているので、なぜこれが正しく機能しないのかが分かりません。ここで更新されたコード – jsw324

+0

これは長すぎます元の投稿に追加します – jsw324

+0

@ jsw324 Firefoxの500エラーメッセージをクリックするか、[ネットワーク]タブに移動して関連するをクリックすると、ブラウザのコンソールで詳細なエラーメッセージを確認できますChromeでのリクエスト私にとって、このような500のエラーは、未定義の変数などを使用することによって発生します。 –

0

あなたのDBクエリは

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

が、それはあなたがレコードを更新するためのAJAXリクエストを送信している

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

申し訳ありません、はい、元のコードでそう言います。私は簡単にするためにいくつかのフィールドをカットし、誤ってcandIDを削除しました。変更を反映するように編集されました。 – jsw324

関連する問題