Hapi.js UnhandledPromiseRejectionWarning: Ошибка: интерфейс ответа вызывается дважды? - PullRequest
0 голосов
/ 21 мая 2018

когда я запускаю свой проект, я получаю сообщение об ошибке:

(node:5795) UnhandledPromiseRejectionWarning: Error: reply interface called twice
    at Object.exports.assert (/Users/labikemmy/Downloads/React-Native-FriendChat/api/node_modules/hoek/lib/index.js:736:11)
    at Function.internals.response (/Users/labikemmy/Downloads/React-Native-FriendChat/api/node_modules/hapi/lib/reply.js:164:10)
    at bound (domain.js:301:14)
    at Function.runBound (domain.js:314:12)
    at reply (/Users/labikemmy/Downloads/React-Native-FriendChat/api/node_modules/hapi/lib/reply.js:72:22)
    at bound (domain.js:301:14)
    at runBound (domain.js:314:12)
    at result.then (/Users/labikemmy/Downloads/React-Native-FriendChat/api/node_modules/hapi/lib/handler.js:105:36)
    at <anonymous>
    at process._tickDomainCallback (internal/process/next_tick.js:228:7)
(node:5795) 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: 1)
(node:5795) [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.
null

Я не знаю, это ошибка или ошибка моего кода?У меня проблемы с экраном hapi.js, и кто-то сказал, что ошибка является ошибкой, а другой сказал: «Время ответа () ограничено в одном запросе»?если он ограничен, как изменить код ниже?

`` `

export default async function (request, reply) {
    if (request.auth.credentials.email !== request.payload.email) {
        await User.findOne({ email: request.auth.credentials.email }).then(
            (user) => {
                if (user) {
                    User.findOne({ email: request.payload.email }).then(
                        (friend) => {
                            if (friend) {
                                const stringId = `${friend._id}`;
                                const friendExists = user.friends.filter(f => `${f}` === stringId).length > 0;
                                if (!friendExists) {
                                    user.friends.push(friend);
                                    user.save();
                                    reply({ friend: { fullName: friend.fullName, _id: friend._id } });
                                } else {
                                    reply(Boom.conflict('You have added already this friend'));
                                }
                             } else {
                                 reply(Boom.notFound(`Friend ${request.payload.email} doesn't exist`));
                             }
                        },
                   );
              } else {
                   reply(Boom.notFound('Cannot find user'));
              }
         },
     );
  } else {
      reply(Boom.conflict('Cannot add yourself as a friend'));
  }
}

Hapi@16.4.1

1 Ответ

0 голосов
/ 21 мая 2018

Есть ли у вас другие плагины или хуки жизненного цикла, например onPreHandler или что-то еще?Возможно, в какой-то момент ваш код выдает эту ошибку, потому что вы (или ваш код каким-то образом) вызываете интерфейс ответа до вашего фактического ответа.

Кроме того, я рефакторинг вашего кода.Вы уже используете асинхронный интерфейс JavaScript, поэтому вам не нужно отправлять вызовы «тогда» на ваши обещания.

Попробуйте и посмотрите, что получится:

export default async function (request, reply) {

    if (request.auth.credentials.email === request.payload.email) {
        return reply(Boom.conflict('Cannot add yourself as a friend'))
    }

    // I belive this is mongoose model
    const user = await User.findOne({email: request.auth.credentials.email}).exec();
    if (!user) {
        return reply(Boom.notFound('Cannot find user'));
    }

    const friend = await User.findOne({email: request.payload.email}).exec();

    if (!friend) {
        return reply(Boom.notFound(`Friend ${request.payload.email} doesn't exist`));
    }

    const stringId = `${friend._id}`;
    const friendExists = user.friends.filter(f => `${f}` === stringId).length > 0;
    if (!friendExists) {
        // hmmm shouldn't it be friend._id? user.friends.push(friend._id.toString());
        user.friends.push(friend);
        // better use this statement
        // ref: http://mongoosejs.com/docs/api.html#document_Document-markModified
        user.markModified('friends');
        await user.save();
        return reply({friend: {fullName: friend.fullName, _id: friend._id}});
    } else {
        return reply(Boom.conflict('You have added already this friend'));
    }
}
...