【问题标题】:server.inject with hapijs not return the correct response带有 hapijs 的 server.inject 不返回正确的响应
【发布时间】:2016-09-11 03:47:11
【问题描述】:

我正在尝试使用 Lab 来测试一些代码。但是,由于某种原因,当我放置正确的有效负载时,我的代码什么也不做。承诺似乎没有得到回报:

'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');
    }
});

如果我编辑代码使得没有负载或者它与我的 Joi 验证不匹配,那么我会得到响应:

{"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 时,这段代码可以工作。我想不通。

【问题讨论】:

  • 我建议使用诸如 chrome 开发者工具之类的工具来检查您发送到服务器的实际请求,并将其与您用于手动测试的请求进行比较。生成的请求很可能略有不同。
  • 我不熟悉 hapijs。但我从阅读文档中的第一个猜测是,您的服务器代码可能应该是:request.mobile 而不是 request.payload.mobile?只是猜测我可能会走得很远。
  • 我很遥远。我做了一些研究并尝试创建一个类似的项目。我发现了导致 joi 验证挂起的问题。发布该发现的答案。
  • 建议不要报错,用hapi的回复界面返回给客户端
  • createUserSchema: 'use strict'; const Joi = require('joi'); const createUserSchema = Joi.object({ mobile: Joi.number().min(10).required() }); module.exports = createUserSchema;

标签: mongodb hapijs lab


【解决方案1】:

很抱歉原始答案没有得到任何地方。我已经回去尝试使用实验室重新创建您的测试: 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 项目,了解如何为我实施测试以发现差异。希望对您有所帮助。

哦..你知道你需要确保你在你的测试中调用 done() 来结束它;)可能为什么它会挂在你身上

原始答案供参考: 我已经尽我所能重建了你的环境。不得不说我喜欢这个 hapi.js 框架。非常好!快速启动服务器的方法。竖起大拇指。不错的选择。

所以这是我根据您发布的代码通过模拟发现的: https://github.com/davethomas11/stackoverlfow_Q_39432656

在该解决方案中,您将找到设置验证的位置:

validate: {
            payload: createUserSchema
        }

我假设 createUserSceme 是您设置为有效载荷值的函数。如果它是一个函数,它将导致请求挂起并且永远不会返回!因此,您看到的行为就好像永远不会返回承诺一样。服务器从不响应。如果我把它改成这个......

validate: {
            payload: createUserSchema()
        }

然后我们都没事,验证可以继续。所以这里的目标是确保 validate 的值是一个对象。

请注意,我通过猜测嘲笑了您的 createUserSchema。因此,如果您想深入了解下一个问题。请发布更多代码,我很乐意尝试看看我是否可以提供更多帮助 =)(继续观看 Nacros 第 2 季的更多内容,我明天再回来查看)

【讨论】:

  • 当我将其更改为函数时,我得到TypeError: createUserSchema is not a function
  • 好吧,我猜这是一个基于变量名的函数。检查您添加的新代码。
  • @Grouchy - 我已更新我的测试源以匹配您的 Joi 架构 github.com/davethomas11/stackoverlfow_Q_39432656/commit/…。一切正常,服务器不会挂起。我的下一个猜测是查看函数 sendVerificationText。问题可能是 sendVerificationText 没有返回,导致它具有您所看到的行为。你也可以发布 sendVerificationText 吗?
  • 嗨@Grouchy。我也花时间实施实验室测试。我注意到你没有任何我添加的断言。我在你的实现中使用了你的代码。它对我有用(似乎没有返回承诺)。也许检查我更新的答案和 github 项目是否有任何差异?
  • @Grouchy 发现了一些可能。你不是在你的实验室测试函数中调用 done() 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
相关资源
最近更新 更多