2016-12-28 3 views
3

Это время, когда я звоню в большие пушки для этого, так как я не могу понять это.
У меня есть простой CRUD API в узле. Я использую EJS на front-end. По сути, у меня есть вид selectAllRecords, где я показываю таблицу всех записей. У меня есть кнопка рядом с каждой записью, чтобы отредактировать запись. Когда кнопка нажата, она перенаправляется на страницу editrecord.ejs, попадает в API для одной записи, где каждая строка отображается как значение в поле ввода. Оттуда у меня есть метод onclick с XMLHttpRequest, создающий запрос на обновление базы данных. Тем не менее, я получаю сообщение об ошибке - 500 (Internal Server Error) - Я уверен, что это что-то довольно просто, я пропала без вести, но я не могу понять это.NodeJS Update 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» (или любой другой идентификатор) и «500 (Внутренняя ошибка сервера)». Если я сильно перезагружаю представление 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

Вы отправляете запрос AJAX для обновления записи. Таким образом, вы не должны пытаться использовать render или redirect пользователь в качестве ответа на этот запрос. Вместо этого вы можете отправить объект JSON с некоторыми свойствами, например. "положение дел".

Затем на клиентской стороне вы проверяете возвращенный ответ JSON и на основании параметра «статус» (или любого другого, который вы выбрали), вы можете либо обновить свои данные, либо обновить страницу с помощью window.reload на стороне клиента.

+0

Итак, я изменил метод updateCandidate, чтобы вернуть ответ JSON, но я все равно получаю то же самое 500 Internal Server Error. Это может быть проблема с разрешениями?Моя консоль dev показывает мне, что запрос PUT попадает в правый URL, поэтому я действительно в недоумении, почему это не будет работать правильно. Вот обновленный код – jsw324

+0

, я слишком долго добавлю его в исходное сообщение – jsw324

+0

@ jsw324 Вы можете проверить подробное сообщение об ошибке в консоли своего браузера, нажав сообщение об ошибке 500 в firefox или перейдя на вкладку «Сеть», а затем нажав соответствующую ссылку запрос в 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

Извините, да, это говорит о том, что в исходном коде. Я вырезал некоторые поля для простоты и удалил случайно. Отредактировано с учетом изменений. – jsw324