【问题标题】:Why am I not getting a response from express server?为什么我没有得到快递服务器的响应?
【发布时间】:2022-02-05 06:31:09
【问题描述】:

向我的服务器发送注销请求,但我从未收到回复。正在调用注销功能,并且正在从我的 redis 缓存中删除用户 ID 键,但我从未得到响应。这是我的代码。

export const logout = async (req, res) => {
  console.log("logout called");
  const { userID } = req.user;

  client.del(userID.toString, (err, reply) => {
    console.log("inside client.del");
    if (err) {
      return res.status(500);
    } else {
      return res.status(200);
    }
  });
};

【问题讨论】:

    标签: express redis


    【解决方案1】:

    因为有回调,所以应该使用promise

    export const logout = async (req, res) => {
        return new Promise((resolve,reject) => {
            console.log("logout called");
                const { userID } = req.user;
            
                client.del(userID.toString, (err, reply) => {
                console.log("inside client.del");
                if (err) {
                    reject(res.status(500));
                } else {
                    resolve(res.status(200));
                }
            });
        });
    }
    

    【讨论】:

    • 这个logout()函数的假定点是实际在数据库中进行注销,然后对reqres参数所代表的http请求发送响应。您的建议没有这样做。
    【解决方案2】:

    res.status() 不从服务器发送响应。它所做的只是将状态设置为响应对象上的一个属性,该属性将与实际发送响应的未来调用一起使用。

    它的用途是这样的:

    res.status(500).send("Database error");
    

    如果您查看Express doc 中的res.status(),您会看到以下示例:

    res.status(403).end()
    res.status(400).send('Bad Request')
    res.status(404).sendFile('/absolute/path/to/404.png')
    

    而且,请注意,它们后面都跟着一些其他方法,这些方法实际上会导致发送响应。


    而且,如果您仍有任何疑问,可以查看 Express code repository 并查看以下内容:

    res.status = function status(code) {
      this.statusCode = code;
      return this;
    };
    

    这表明它只是在响应对象上设置了一个属性,并没有真正发送响应。


    您可以改用res.sendStatus() 来设置状态并发送响应:

    export const logout = (req, res) => {
      console.log("logout called");
      const { userID } = req.user;
    
      client.del(userID.toString, (err, reply) => {
        console.log("inside client.del");
        if (err) {
          res.sendStatus(500);
        } else {
          res.sendStatus(200);
        }
      });
    };
    

    请注意,我删除了两个 return 关键字,因为它们在此特定上下文中没有任何用处。

    我还从函数定义中删除了 async 关键字,因为它在这种情况下没有做任何有用的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2019-08-20
      • 1970-01-01
      • 2019-09-02
      • 1970-01-01
      相关资源
      最近更新 更多