邮递员在向快速路线发送请求时挂起(保持加载)

时间:2020-09-07 13:07:51

标签: javascript mysql node.js express postman

我创建了这个api,该api生成了两个用户(类似于linkedin或任何其他社交媒体)之间的连接请求

/**
 * sendRequest
 * * Send request to a user
 * TODO: Testing required
 * @param {string} from username of request send from
 * @param {string} to username of request send to
 */
User.sendRequest = (from, to) => {
  return new Promise((resolve, reject) => {
    const userId = 0;
    const friendId = 0;

    User.findByUsername(from)
      .then((data) => {
        userId = data.id;
        console.log(data);
        User.findByUsername(to)
          .then((data) => {
            friendId = data.id;
            Connects.checkConnectionStatus(from, to)
              .then((areFriends) => {
                if (!areFriends) {
                  const connects = new Connects({ userId, friendId });
                  console.log(connects);
                  Connects.create(connects)
                    .then((data) => resolve(data))
                    .catch((err) => reject(err));
                } else {
                  const newError = new Error(
                    `Users ${from} and ${to} are already connections`
                  );
                  newError.status = 400;
                  return reject(newError);
                }
              })
              .catch((err) => {
                console.log(`Error: ${err}`);
                return reject(err);
              });
          })
          .catch((err) => {
            if (err.status && err.status === 404) {
              reject(err);
            }
          });
      })
      .catch((err) => {
        if (err.status && err.status === 404) {
          reject(err);
        }
      });
  });
};

在这里,我首先检查提供的用户名是否有效。 我正在使用模型用户,该模型为我提供了通过findByUsername()函数检查用户是否具有用户ID的功能。

我分别检查了每个模型,它们正在工作。但是在上述路线上发送请求时,邮递员继续加载。请让我知道解决方法。

按用户名模型查找:

/**
 * findByUsername
 * * Finds a user by username
 * @param {string} username username whose detail needed to find
 */
User.findByUsername = (username) => {
  return new Promise((resolve, reject) => {
    const query = `
            SELECT 
                u.*, p.* 
            FROM user u INNER JOIN profile p 
            ON u.username = p.username 
            WHERE u.username = ?
        `;
    sql.query(query, username, (err, res) => {
      if (err) {
        console.log(`Error: ${err}`);
        return reject(err);
      }
      if (!res.length) {
        const newError = new Error(`User with username ${username} not found`);
        newError.status = 404;
        return reject(newError);
      }
      console.log(`Found user: `, res);
      resolve(res[0]);
    });
  });
};

连接构造函数:

// constructor
const Connects = function (connect) {
  this.userId = connect.userId;
  this.friendId = connect.friendId;
  this.status = 1;
};

创建连接的方法:

/**
 * create
 * * Creates a new connection request between two users
 * @param {object} newConnect A connection object
 */
Connects.create = (newConnect) => {
  console.log(newConnect);
  return new Promise((resolve, reject) => {
    const query = "INSERT INTO connects SET ?";
    sql.query(query, newConnect, (err, res) => {
      if (err) {
        console.log(`Error: ${err}`);
        return reject(err);
      }
      const response = { id: res.insertId, ...newConnect };
      console.log(`Created connect: `, response);
      resolve(response);
    });
  });
};

这是路线:

// TODO: Send request
router.post(
  "/request",
  [body("from").not().isEmpty().escape(), body("to").not().isEmpty().escape()],
  (req, res, next) => {
    // Finds validation errors and return error object
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }
    const { from, to } = req.body;

    if (from === to) {
      const newError = new Error("Equal input is not allowed");
      newError.status = 400;
      next(newError);
    } else {
      User.sendRequest(from, to)
        .then((data) => res.json(data))
        .catch((err) => next(err));
    }
  }
);

邮递员行为: enter image description here

2 个答案:

答案 0 :(得分:0)

您没有向我们显示您API的Express路由处理程序。从您的邮递员的死讯看来,您的路由处理程序永远不会调用类似的东西

res.json(whatever).status(200).end()

在您所有的诺言兑现之后。邮递员耐心地等待来自节点快速服务器的响应或超时。

答案 1 :(得分:0)

问题已修正:
这么尴尬地说,是的,我犯了这个错误。
在sendRequest方法中,我定义了常量变量userId和friendId,并且正在像userId = data.id一样对其进行修改。
我使用let关键字将常量变量更改为局部变量。

已更改:
发件人:

const userId = 0;
const friendId = 0;

收件人:

let userId = 0;
let friendId = 0;  

但是,我想解释一下为什么在尝试更改常量变量时​​控制台没有出现错误?这件事发生在Promises吗?