【问题标题】:my async request is not working in express我的异步请求不能在 express 中工作
【发布时间】:2019-12-26 03:42:16
【问题描述】:

我正在尝试将我的请求转换为异步调用,以便它们不会阻塞。

app.js

app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};
  console.log(err);
  res.status(err.status || 500);
  res.json({ error: err.message });
});

路线

router.get(
  "/seatData/:seatNumber",
  [
    check("seatNumber")
      .matches(/^[0-9][a-z]$/i)
      .withMessage("must start with a number(0-9) and end with a letter")
  ],
  actions.fetch_seat
);

控制器

exports.fetch_seat = (req, res, next) => {
  Seat.getSeatByNumber(req.params.seatNumber, (err, seat) => {
    if (err) res.json(err);
    else res.json(seat);
  });
};

型号

Seat.findSeat = function(key, value) {
  return new Promise((resolve, reject) => {
    const seat = file.find(r => r[key] === value);
    if (!seat) {
      reject({
        error: true,
        message: "Seat not found",
        status: 404
      });
    }
    resolve(seat);
  });
  /*
  this.seat = file.find(obj => obj[key] === value);
  return this.seat;
  */
};
Seat.getSeatByNumber = function(seatNumber, result, next) {
  try {
    this.seat = this.findSeat("seatNumber", seatNumber)
      .then(seat => {
        if (seat !== undefined && Object.keys(seat).length > 0) {
          result(null, seat);
        } else {
          result({ error: true, message: "Seat not found" });
        }
      })
      .catch(error => {
        return;
      });
  } catch (error) {
    console.log(error);
  }
  /*  if (this.seat !== undefined && Object.keys(this.seat).length > 0) {
    result(null, this.seat);
  } else {
    result({ error: true, message: "Seat not found" });
  }*/
};

我尝试遵循一些在线指南,但我似乎无法将错误响应回复为表达。 /* ... */ 中的代码是我要转换的原始代码

更新

第 1 次捕获和第 2 次捕获有什么区别。还有我的 app.js 怎么没有捕捉到我返回的状态码?

Seat.findSeat = function(key, value) {
  return new Promise((resolve, reject) => {
    const seat = file.find(r => r[key] === value);
    if (!seat) {
      reject({
        error: true,
        message: "Seat not found",
        status: 404
      });
    }
    resolve(seat);
  });

};

Seat.getSeatByNumber = function(seatNumber, result, next) {
  try {
    this.seat = this.findSeat("seatNumber", seatNumber)
      .then(seat => {
        console.log(seat);
        if (seat !== undefined && Object.keys(seat).length > 0) {
          result(null, seat);
        } else {
          result({ error: true, message: "Seat not found" });
        }
      })
      .catch(error => {
        console.log("1st catch");
        return result(error);
      });
  } catch (error) {
    console.log("outer catch");
    console.log(error);
    result(error);
  }

};

app.js 此处未记录错误

app.use(function(err, req, res, next) {
  res.locals.message = err.message;
  res.locals.error = req.app.get("env") === "development" ? err : {};
  console.log('apperro' , err) // <-- does not log this
  res.status(err.status || 500);
  res.json({ error: err.message });
});

更新 2

添加next 后出现以下错误。您可以将seatData/1T 传入沙箱中的url https://codesandbox.io/s/elucidate-api-fokd8

(node:319) UnhandledPromiseRejectionWarning: TypeError: next is not a function
    at Seat.getSeatByNumber (/sandbox/src/controller/appController.js:15:14)
    at findSeat.then.catch.error (/sandbox/src/model/seat.js:45:16)
(node:319) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:319) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

【问题讨论】:

    标签: javascript express asynchronous promise


    【解决方案1】:

    您似乎希望将错误从模型文件中带回控制器,对吗?

    您的模型文件中的 2 个 catch 块中似乎没有返回错误。

    在您的 catch 块中,您应该使用您的 result 对象,而不仅仅是 returnconsole.log(error),如下所示:result(error);

    更新:

    在您的控制器中,您使用的是res.json()。为了让您的逻辑处理进入您在app.use 中定义的下一步,您可以尝试使用带有相关参数的next() 而不是res.json()

    使用res.json(),请求只需发送一个 JSON 响应并在此结束。

    更新 2:

    exports.fetch_seat = (req, res, next) => {
      Seat.getSeatByNumber(req.params.seatNumber, (err, seat) => {
        if (err) next(err); // Error, pass error back to express
        else res.json(seat); // No error, respond immediately
      });
    };
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    相关资源
    最近更新 更多