标签: hapijs

Express和hapi如何相互比较?

从Web应用程序的设计和开发的角度来看,Express和Hapi如何相互比较?对于基本示例,它们看起来很相似,但是我有兴趣了解有关整体应用程序结构的主要差异.

例如,据我所知,Hapi使用不同的路由机制,不考虑注册顺序,可以做更快的查找,但与Express相比是有限的.还有其他重要的区别吗?

还有一篇关于选择Hapi(over Express)开发新npmjs.com网站的文章,本文指出"Hapi的插件系统意味着我们可以通过允许微服务的方式隔离应用程序的不同方面和服务.另一方面,Express需要更多的配置来获得相同的功能",这究竟意味着什么?

frameworks node.js express hapijs

127
推荐指数
2
解决办法
4万
查看次数

使用Hapi时如何在单独的文件中存储路由?

所有Hapi示例(以及Express中的类似示例)都显示路由在起始文件中定义:

var Hapi = require('hapi');

var server = new Hapi.Server();
server.connection({ port: 8000 });

server.route({
  method: 'GET',
  path: '/',
  handler: function (request, reply) {
    reply('Hello, world!');
  }
});

server.route({
  method: 'GET',
  path: '/{name}',
  handler: function (request, reply) {
    reply('Hello, ' + encodeURIComponent(request.params.name) + '!');
  }
});

server.start(function () {
  console.log('Server running at:', server.info.uri);
});
Run Code Online (Sandbox Code Playgroud)

但是,在实现具有大量不同路由的生产应用程序时,不难想象这个文件有多大.因此,我想分解路由,将它们分组并存储在单独的文件中,如UserRoutes.js,CartRoutes.js,然后将它们附加到主文件中(添加到服务器对象).您如何建议将其分开然后添加?

routes node.js hapijs

50
推荐指数
3
解决办法
2万
查看次数

如何在注销时销毁JWT令牌?

我在hapijs中使用jwt插件和策略.我能够在登录用户时创建jwt令牌,并通过'jwt'策略使用相同的令牌验证其他API.我在'request.state.USER_SESSION'中将令牌设置为一个cookie,其中USER_SESSION是令牌名称.另外,我没有将这些令牌保存在数据库中.但是如何在注销时销毁jwt令牌.请建议一个方法.

node.js jwt hapijs

42
推荐指数
4
解决办法
7万
查看次数

Joi验证数组

试图验证一个数组在一个案例中有零个或多个字符串,并且它在另一个案例中有零个或多个对象,与Joi文档挣扎:(

validate: {
        headers: Joi.object({
                'content-type': "application/vnd.api+json",
                accept: "application/vnd.api+json"
        }).options({ allowUnknown: true }),
        payload : Joi.object().keys({
            data : Joi.object().keys({
                type: Joi.any().allow('BY_TEMPLATE').required(),
                attributes: Joi.object({
                    to : Joi.string().email().required(),
                    templateId : Joi.string().required(),
                    categories : Joi.array().items( //trying to validate here that each element is a string),
                    variables : Joi.array({
                        //also trying to validate here that each element is an Object with one key and value
                    })
                })
            }).required()
        })
    }
Run Code Online (Sandbox Code Playgroud)

hapijs joi

36
推荐指数
4
解决办法
4万
查看次数

Joi验证只返回一条错误消息

我有一个由字段,电子邮件字段和textarea组成的三个字段表单.我正在使用Joi 4.7.0版本和hapijs.我使用下面的对象验证输入.我从ajax调用接收数据对象.当我用错误的信息填充所有三个字段时,我只得到相对于第一个错误字段的消息.像那样:

"{"statusCode":400,"error":"Bad Request","message":"name is not allowed to be empty","validation":    {"source":"payload","keys":["data.name"]}}"
Run Code Online (Sandbox Code Playgroud)
validate: {
      payload: {
        data: {
          name: Joi.string().min(3).max(20).required(),
          email: Joi.string().email().required(),
          message: Joi.string().min(3).max(1000).required()
        }
      }
}
Run Code Online (Sandbox Code Playgroud)

为了解释,我们假设不填写三个字段.我只收到一条消息错误,而不是其他字段的消息错误.为什么?

validation hapijs

24
推荐指数
3
解决办法
1万
查看次数

如何使用nodejs和HAPI上传文件?

谁能告诉我如何使用nodejs和HAPI上传文件?

我在处理程序中获取二进制数据.

这是我的HTML代码:

function sendFormFromHTML(form) {
        //form = $(".uploadForm").form;
        var formData = new FormData(form);
        formData.append('id', '123456'); // alternative to hidden fields
        var xhr = new XMLHttpRequest();
        xhr.open('POST', form.action, true);
        xhr.onload = function(e) { alert(this.responseText) };
        xhr.send(formData);
        return false;
    } 



<form method="post" id="uploadForm" action="http://localhost:3000/api/uploadfiles" enctype="multipart/form-data">
    <label for="upload">File (Binary):</label>
    <input type="file" name="upload" class="fileupload" /><br/>

    <input type="button" class="submit" value="Submit" onclick="sendFormFromHTML(this.form);"/>
  </form>
Run Code Online (Sandbox Code Playgroud)

这是My Nodejs代码:

server.route({
    method: 'POST',
    path: '/api/uploadfiles',
    config: {        
        handler: currentposition.uploadFiles,
    }
});

uploadFiles:function(req,reply){
    console.log(req.payload);
}
Run Code Online (Sandbox Code Playgroud)

javascript node.js express hapijs

18
推荐指数
3
解决办法
2万
查看次数

Hapi嵌套路由

假设我希望REST端点看起来像这样:

/projects/
/projects/project_id 

/projects/project_id/items/
/projects/project_id/items/item_id
Run Code Online (Sandbox Code Playgroud)

每个CRUD都有意义.例如,/ projects POST创建一个新项目,GET获取所有项目./ projects/project_id GET只获取一个项目.

项目是特定于项目的,因此我将它们放在project_id下,这是一个特定的项目.

有没有办法创建这种嵌套路线?

现在我有这样的事情:

  server.route({
    method: 'GET',
    path: '/projects',
    handler: getAllProjects
  });

  server.route({
    method: 'GET',
    path: '/projects/{project_id}',
    handler: getOneProject
  });

  server.route({
    method: 'GET',
    path: '/projects/{project_id}/items/{item_id}',
    handler: getOneItemForProject
  });

  server.route({
    method: 'GET',
    path: '/projects/{project_id}/items',
    handler: getAllItemsForProject
  })
Run Code Online (Sandbox Code Playgroud)

但我正在寻找一种方法将项目路线嵌套到项目路线中,以及进一步传递项目的能力.

有什么建议?

javascript url-routing node.js hapijs

18
推荐指数
2
解决办法
2057
查看次数

如何在不使用日志记录库的情况下记录对hapi服务器发出的所有请求?

我希望看到一个很好的日志,其中包含有关我的服务器的每个请求的简短信息,以便在开发期间使用.我已经在http://hapijs.com/api#request-logs上看到过这些文档,但是我无法理解它能让它运行起来.

config在创建服务器时,我应该将什么作为对象传递?我应该听事件并记录它们还是自动发生?如何记录所有请求,而不仅仅是错误?

我想避免安装日志库.

javascript logging hapijs

16
推荐指数
3
解决办法
1万
查看次数

如何在Hapi中获取请求的完整URL

在我的hapijs应用程序中,给定一个Request对象,我如何找到原始的,未解析的,未修改的URL?

function getRequestUrl (request) {
    return ...; // What goes here?
}
Run Code Online (Sandbox Code Playgroud)

我发现我可以从拼凑不是有点Request.info.host,Request.path以及Request.query,但它缺乏的方案(即http和HTTPS),并且是一个有点杂牌的.在某处可以使用普通URL吗?

url hapijs

16
推荐指数
1
解决办法
1万
查看次数

我应该如何使用Swagger和Hapi?

我有一个普通的Hapi应用程序,我打算迁移到Swagger.我使用官方指令安装了swagger-node,并在执行'swagger project create'时选择了Hapi.但是,我现在感到困惑,因为似乎有几个库用于集成swagger-node和hapi:

  1. hapi-swagger:最受欢迎的一个
  2. hapi-swaggered:有点流行
  3. swagger-hapi:不受欢迎而且不活跃但被官方Swagger Node.js库(即swagger-node)用作Hapi项目的默认值

我虽然swagger-hapi是"官方"的方法,直到我试图找到关于如何在Hapi路线上进行各种配置的信息(例如授权,范围等).似乎这些方法根本不同,swagger-hapi将Swagger定义作为输入并自动生成路径,而hapi-swagger和hapi-swaggered似乎通过仅从普通的旧Hapi生成Swagger API文档而具有相似的方法路线定义.

考虑到贡献者的数量和下载次数,hapi-swagger似乎是要走的路,但我不确定如何继续.是否有"官方"Swagger方式来设置Hapi,如果有,我如何设置身份验证(最好是使用hapi-auth-jwt2或其他类似的JWT解决方案)和授权?

编辑:我也发现了swaggerize-hapi,这似乎是由PayPal的开源kraken.js团队维护的,这表明它可能有某种企业支持(总是一件好事).swaggerize-hapi似乎与hapi-swagger非常相似,虽然后者似乎提供了更多开箱即用的功能(主要是Swagger Editor).

node.js swagger hapijs

16
推荐指数
1
解决办法
5153
查看次数