0

正如我在标题中所说,我正在使用一个名为“next-connect”的 npm 包来构建我的 api。我创建的每个 api 路由都遭受了这个错误。这是错误:

Unhandled rejection: TypeError: Cannot read property 'end' of undefined
    at next (/var/task/node_modules/next-connect/lib/index.js:43:54)
    at next (/var/task/node_modules/next-connect/lib/index.js:49:9)
    at next (/var/task/node_modules/next-connect/lib/index.js:58:16)
    at next (/var/task/node_modules/next-connect/lib/index.js:49:9)
    at next (/var/task/node_modules/next-connect/lib/index.js:58:16)
    at next (/var/task/node_modules/next-connect/lib/index.js:58:16)
    at next (/var/task/node_modules/next-connect/lib/index.js:60:9)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:228:7)

经过几分钟的尝试,我可以在 dev 中解决它。其中大部分是由于弄乱了 .env 文件。

这是我的 API Route 中的代码:

import nextConnect from "next-connect";
import bcrypt from "bcryptjs";
import middleware from "../../middlewares/middleware";

const handler = nextConnect();

handler.use(middleware);

handler.get((req, res) => {
  if (req.user) {
    const { name, email, bio, profilePicture, emailVerified } = req.user;
    return res.status(200).send({
      status: "ok",
      data: {
        isLoggedIn: true,
        user: {
          name,
          email,
          bio,
          profilePicture,
          emailVerified
        }
      }
    });
  }
  return res.status(200).send({
    status: "ok",
    data: {
      isLoggedIn: false,
      user: {}
    }
  });
});

handler.post((req, res) => {
  const { email, password } = req.body;

  return req.db
    .collection("users")
    .findOne({ email })
    .then(user => {
      if (user) {
        return bcrypt.compare(password, user.password).then(result => {
          if (result) return Promise.resolve(user);
          return Promise.reject(Error("The password you entered is incorrect"));
        });
      }
      return Promise.reject(Error("The email does not exist"));
    })
    .then(user => {
      req.session.userId = user._id;
      return res.send({
        status: "ok",
        message: `Welcome back, ${user.name}!`
      });
    })
    .catch(error =>
      res.send({
        status: "error",
        message: error.toString()
      })
    );
});

handler.delete((req, res) => {
  delete req.session.userId;
  return res.status(200).send({
    status: "ok",
    message: "You have been logged out."
  });
});

export default handler;

这里的代码来自 next-connect 包(错误报告中提到的那个):

module.exports = () => {
  function connect(req, res) {
    connect.handle(req, res);
  }

  connect.stack = [];

  function add(method, ...handle) {
    for (let i = 0; i < handle.length; i += 1) {
      if (handle[i].stack) Object.assign(this.stack, handle[i].stack);
      else this.stack.push({ handle: handle[i], method });
    }
  }

  // method routing
  connect.get = add.bind(connect, 'GET');
  connect.head = add.bind(connect, 'HEAD');
  connect.post = add.bind(connect, 'POST');
  connect.put = add.bind(connect, 'PUT');
  connect.delete = add.bind(connect, 'DELETE');
  connect.options = add.bind(connect, 'OPTIONS');
  connect.trace = add.bind(connect, 'TRACE');
  connect.patch = add.bind(connect, 'PATCH');

  // middleware
  connect.use = add.bind(connect, '');
  connect.error = add.bind(connect, 'ERR');

  connect.apply = function apply(req, res) {
    return new Promise((resolve) => this.handle(req, res, resolve));
  };

  connect.handle = function handle(req, res, done) {
    let idx = 0;
    const { stack } = this;
    async function next(err) {
      const layer = stack[idx];
      idx += 1;

      //  all done
      if (!layer) {
        if (done) done();
        else if (!res.headersSent) res.writeHead(404).end();
        return;
      }

      //  check if is correct method or middleware
      if (layer.method !== '' && layer.method !== 'ERR' && layer.method !== req.method) {
        next(err);
        return;
      }

      try {
        if (!err) { await layer.handle(req, res, next); return; }
        //  there is an error
        if (layer.method === 'ERR' || layer.handle.length === 4) {
          await layer.handle(err, req, res, next);
        } else next(err);
      } catch (error) {
        next(error);
      }
    }

    //  Init stack chain
    next();
  };

  return connect;
};
4

0 回答 0