【问题标题】:NodeJS Update API - Internal Server ErrorNodeJS 更新 API - 内部服务器错误
【发布时间】:2017-05-12 07:38:14
【问题描述】:

现在是我为此大喊大叫的时候了,因为我似乎无法弄清楚。
我在 Node.js 中有一个简单的 CRUD API。我在前端使用 EJS。本质上,我有一个selectAllRecords 视图,其中显示了所有记录的表格。我在每条记录旁边都有一个按钮来编辑记录。单击该按钮时,它会重定向到editrecord.ejs 页面,并针对单个记录访问 API,其中每一行都显示为输入框中的值。从那里,我有一个带有 XMLHttpRequest 的 onclick 方法,它发出一个 put 请求来更新数据库。但是,我收到一个错误 - 500 (Internal Server Error) - 我确定这是我所缺少的相当简单的东西,但我似乎无法弄清楚。

非常感谢任何帮助!代码如下:

首先在我看来:

<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() 函数时,开发工具日志会显示对“api/edit/50”(或任何 ID)和“500(内部服务器错误)的 PUT 请求)' -- 如果我硬重新加载 '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);
});
}

【问题讨论】:

  • 您是否使用 postman 之类的工具测试过您的 api?
  • 错误是什么?
  • 我用一个 CURL 请求进行了测试,并从一个完全不相关的页面中得到了一个奇怪的错误,该错误是关于一个运行良好的 for 循环。数据库确实更新了。
  • 开发工具日志显示对 /api/edit/48(或任何 id)的 PUT 请求 - 和 '500(内部服务器错误) - 它应该呈现“已编辑”页面,但是它没有。如果我硬重新加载“所有记录”页面,则会反映更新,因此某些功能正常。

标签: javascript node.js express ejs


【解决方案1】:

您正在发送一个 ajax 请求来更新记录。因此,您不应该尝试将render 一个视图或redirect 用户作为此请求的响应。相反,您可以发回具有某些属性的 JSON 对象,例如“状态”。

然后在客户端,您检查返回的 JSON 响应并根据“状态”参数(或您选择的任何其他参数),您可以在客户端使用 window.reload 更新数据或重新加载页面。

【讨论】:

  • 所以我更改了 updateCandidate 方法以返回 JSON 响应,但我仍然收到相同的 500 内部服务器错误。会不会是权限问题?我的开发控制台向我显示 PUT 请求正在访问正确的 URL,所以我真的不知道为什么它不能正常运行。这是更新的代码
  • 太长了我加到原帖里
  • @jsw324 您可以在浏览器控制台中查看详细的错误消息,方法是单击 Firefox 中的 500 错误消息,或者转到“网络”选项卡,然后单击 Chrome 中的相关请求。对我来说,这样的 500 错误是由于使用未定义的变量等而发生的。
【解决方案2】:

你的数据库查询说

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])

【讨论】:

  • 对不起,是的,它确实在原始代码中这么说。为了简单起见,我删除了一些字段并错误地删除了 candID。编辑以反映变化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 2020-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 2019-12-21
相关资源
最近更新 更多