Express中的PATCH路由/端点不起作用

Posted

技术标签:

【中文标题】Express中的PATCH路由/端点不起作用【英文标题】:PATCH route/endpoint in Express not working 【发布时间】:2021-08-21 04:14:00 【问题描述】:

您好,我为一个不起作用的 api 端点编写了以下路由。当我使用 Postman 和我的代码进行测试时,它只是一个 404 not found 错误。

router.patch("/favorite", async (req, res) => 
  user = await User.findById(req.body.id)
  if (user == null) 
    return res.status(404).json( message: 'Cannot find user' )
  
  if (req.body.putArr != null) 
    res.user.favPokemon = req.body.putArr;
  
  try 
    const updatedUser = await res.user.save();
    console.log(res.user.favPokemon);
    console.log(updateUser);
    res.json(updatedUser);
   catch (err) 
    res.status(400).json( error: err.message );
  
);

我遗漏了什么/我的代码中有什么错误?作为参考,这是我为用户设置的 mongoDB:

编辑:很抱歉没有指定端点。更清楚地说,调用它的端点和代码是:

const favThis = async (e) =>  // Patch method to favorite or unfavorite a pokemon
    debugger;
    e.preventDefault();
    try 
      console.log(putArr);
      const newUser = userID, putArr;
      await axios.patch("http://localhost:5000/users/favorite", newUser);
     catch(err) 
      err.response.data.msg && setError(err.response.data.msg)
    
    ;

,所以它是http://localhost:5000/users/favorite。我有其他端点工作正常,例如http://localhost:5000/users/loginhttp://localhost:5000/users/register,在server.js 里面我有app.use("/users", require("./routes/users"));

另外,server.js 很简单

const express = require("express");
const mongoose = require("mongoose");
const cors = require("cors");
require("dotenv").config();

// set up express

const app = express();
app.use(express.json());
app.use(cors());

const PORT = process.env.PORT || 5000;

app.listen(PORT, () => console.log(`The server has started on port: $PORT`));

// set up mongoose
mongoose.connect(
  process.env.MONGODB_CONNECTION_STRING,
  
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useCreateIndex: true,
  ,
  (err) => 
    if (err) throw err;
    console.log("MongoDB connection established");
  
);

// set up routes

app.use("/users", require("./routes/users"));
app.use("/todos", require("./routes/todo"));

编辑 2::我现在注意到,当我在 Postman 上进行测试时,它是一个无限循环并且调用被挂起。我还在控制台中收到以下警告:

(node:36447) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志 --unhandled-rejections=strict(请参阅 https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。 (拒绝编号:1)

(node:36447) [DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

【问题讨论】:

你的 HTTP 请求是什么样的? 您的 API 的基本 URL 是什么?这应该在您的index.js 或您使用的任何入口点中定义。它应该类似于https://localhost:3000/api/favorite 我注意到您的帖子与评论中的端口不同(3000 v 5000)。 router.patch 是否包含在 server.js 中? 对不起,我又犯了一个错误,我的意思是在评论中写 localhost:5000/users/favorite。不,我在路由文件夹下的 users.js 中有 router.patch 以及我的其他 HTTP 方法/路由。 Server.js 只是有app.listen,端口,并与mongoDB连接 当您到达端点时,您看到的是 404 吗? return res.status(404).json( message: 'Cannot find user' ) 。根据您发布的内容,代码看起来是正确的。 【参考方案1】:

根据警告,您在未捕获的 Promise 中有失败的代码。也许在这一行user = await User.findById(req.body.id)

Getting a UnhandledPromiseRejectionWarning when testing using mocha/chai

【讨论】:

谢谢,我所做的只是将所有东西都放在“try”大括号内。但是,现在我有错误“无法设置未定义的 'favPokemon' 的属性”,所以我现在就解决这个问题!

以上是关于Express中的PATCH路由/端点不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs Express 重定向不起作用

使用 Express/Passport、AngularJS 和 ensureLoggedIn 的身份验证和路由在“/”url 上不起作用

Passport req.logOut() 函数不起作用? [复制]

使用 Node/Express 限制 CORS 来源不起作用

Webpack 开发服务器代理路由器选项不起作用

Express 4 - 用 promise.then 链接 res.json 不起作用