2016-09-11 3 views
0

Я пытаюсь использовать Lab для проверки кода. Однако по какой-то причине, когда я добавляю правильную полезную нагрузку, мой код ничего не делает. Обещание не кажется, чтобы получить вернулся:server.inject с hapijs не возвращает правильный ответ

'use strict'; 

const Server = require('../server'); 

const options = { 
    method: 'POST', 
    url: '/api/users', 
    payload: JSON.stringify({ mobile: '3342329224' }) 
}; 

Server.inject(options, (response) => { 

    if (response) { 
     console.log(response.payload); 
    } 
    else { 
     console.log('Nada'); 
    } 
}); 

Если я изменить код так, что нет полезной нагрузки или она не соответствует моей проверки дзёи то это я получаю ответ:

{"statusCode":400,"error":"Bad Request","message":"child \"mobile\" fails because [\"mobile\" must be larger than or equal to 10]","validation":{"source":"payload","keys":["mobile"]}} 

module.exports = { 
    method: 'POST', 
    path: '/api/users', 
    config: { 
     auth: false, 
     handler: (request, reply) => { 

      //looks up payload in db otherwise creates entry 
      User.findOne({ 
       mobile: request.payload.mobile 
      }, (err, user) => { 

       if (err) { 
        throw err; 
       } 
       if (user) { 
        // uses twillio to send code 
        sendVerificationText(user, (err, result) => { 

         if (err){ 
          throw err; 
         } 
         if (result === true) { 
          // this is what I expect to happen when testing 
          reply('code sent').code(201); 
         } 
         else { 
          throw Boom.badRequest(err); 
         } 
        }); 
       } 
       else { 
        // the user should exist so.... 
        const user = new User(); 
        user.mobile = request.payload.mobile; 
        user.admin = false; 
        user.save((err, user) => { 

         if (err) { 
          throw Boom.badRequest(err); 
         } 
         sendVerificationText(user, (err, result) => { 

          if (err){ 
           throw err; 
          } 
          if (result === true) { 
           reply('code sent').code(201); 
          } 
          else { 
           throw Boom.badRequest(err); 
          } 
         }); 
        }); 
       } 
      }); 
     }, 
     // Validate the payload against the Joi schema 
     validate: { 
      payload: createUserSchema 
     } 
    } 
}; 

Я должен упомянуть, что этот код работает, когда я запускаю сервер и проверяю api вручную. Я не могу понять.

+0

Я предлагаю использовать что-то вроде инструментов для создания хрома для проверки этот фактический запрос, который вы отправляете на сервер, и сравнить его с запросом, который вы используете для проверки вручную. Скорее всего, что-то немного отличается от генерируемого запроса. –

+0

Я не знаком с hapijs. Но первое мое предположение, прочитав документацию, возможно, ваш серверный код должен быть: request.мобильный вместо запроса.payload.mobile? Просто догадываюсь, что я могу уйти. –

+0

Я ухожу. Я сделал небольшое исследование и попытался создать аналогичный проект. Я нашел проблему, которая заставляет валидацию joi зависать. Проводя ответ с этой находкой. –

ответ

0

Извините за первоначальный ответ, не получив нигде. Я вернулся и попробовал с лабораторией, чтобы воссоздать тест: https://github.com/davethomas11/stackoverlfow_Q_39432656/blob/master/test/users.js

Он, кажется, не висит для меня. Я получаю ожидаемый код ответа. Я положил пару утверждает в функцию, используя библиотеку коды (новая зависимость) в документации лаборатории:

lab.test("user post", function (done) { 

    const options = { 
     method: 'POST', 
     url: '/api/users', 
     payload: JSON.stringify({ mobile: '3342329224' }) 
    }; 

    Server.inject(options, (response) => { 

     if (response) { 
      console.log(response.payload); 
     } 
     else { 
      console.log('Nada'); 
     } 

     Code.expect(response.statusCode).to.equal(201); 
     Code.expect(response.payload).to.equal("code sent"); 
     done(); 
    }); 
}); 

Любопытно то, что вы видите, как вывод, когда вы запускаете тест? Ли для командной строки просто зависает? Проверьте мой проект github на предмет того, как тест выполняется для меня для расхождений. Надеюсь, это поможет вам.

О .. Вы знаете, что вам нужно, чтобы убедиться, что вы вызываете сделали() внутри теста для того, чтобы положить конец;) Наверное, поэтому она висит у вас

Оригинал Ответ для справки: Я воссоздал вашу среду в меру своих способностей. Должен сказать, что мне нравится эта структура hapi.js. Очень хорошо! Быстрый способ получить сервер. Пальцы вверх. Хороший выбор.

Так вот что я нашел насмехаясь на основе вашего публикуемую код: https://github.com/davethomas11/stackoverlfow_Q_39432656

В этом решении вы найдете, где вы установили проверки:

validate: { 
      payload: createUserSchema 
     } 

Я предполагаю, что createUserSceme является которую вы устанавливаете в качестве значения полезной нагрузки. Если это функция, это вызовет зависание и никогда не вернется! Следовательно, поведение, которое вы видите, как будто обещание никогда не возвращается. Сервер никогда не отвечает. Если я изменю его на это ...

validate: { 
      payload: createUserSchema() 
     } 

Тогда мы все в порядке, и проверка может продолжаться. Таким образом, цель здесь - убедиться, что значение validate является объектом.

Имейте в виду, что я высмеивал ваш createUserSchema путем догадки. Поэтому, если вы хотите разобраться в следующей проблеме. Пожалуйста, напишите больше кода, и я с удовольствием попытаюсь посмотреть, смогу ли я помочь больше =) (прочь посмотреть еще несколько сезонов Nacros 2, я вернусь завтра)

+0

Когда я меняю это на функцию, я получаю 'TypeError: createUserSchema не функция' – Grouchy

+0

Хорошо, я предполагал, что это была функция, основанная на имени переменной. Проверка нового кода, который вы добавили. –

+0

@Grouchy - я обновил свой источник тестирования, чтобы соответствовать вашей схеме Joi https://github.com/davethomas11/stackoverlfow_Q_39432656/commit/869f806ab5d69caf9eec783a451dfedbf026e672. Все работает, и сервер не виснет. Следующим моим предположением было бы посмотреть на функцию sendVerificationText. Вполне возможно, что проблема заключается в том, что sendVerificationText не возвращается, заставляя его иметь поведение, которое вы видите. Можете ли вы также отправить sendVerificationText? –