所有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,然后将它们附加到主文件中(添加到服务器对象).您如何建议将其分开然后添加?
我在hapijs中使用jwt插件和策略.我能够在登录用户时创建jwt令牌,并通过'jwt'策略使用相同的令牌验证其他API.我在'request.state.USER_SESSION'中将令牌设置为一个cookie,其中USER_SESSION是令牌名称.另外,我没有将这些令牌保存在数据库中.但是如何在注销时销毁jwt令牌.请建议一个方法.
试图验证一个数组在一个案例中有零个或多个字符串,并且它在另一个案例中有零个或多个对象,与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) 我有一个由字段,电子邮件字段和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)
为了解释,我们假设不填写三个字段.我只收到一条消息错误,而不是其他字段的消息错误.为什么?
谁能告诉我如何使用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) 假设我希望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)
但我正在寻找一种方法将项目路线嵌套到项目路线中,以及进一步传递项目的能力.
有什么建议?
我希望看到一个很好的日志,其中包含有关我的服务器的每个请求的简短信息,以便在开发期间使用.我已经在http://hapijs.com/api#request-logs上看到过这些文档,但是我无法理解它能让它运行起来.
config
在创建服务器时,我应该将什么作为对象传递?我应该听事件并记录它们还是自动发生?如何记录所有请求,而不仅仅是错误?
我想避免安装日志库.
在我的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吗?
我有一个普通的Hapi应用程序,我打算迁移到Swagger.我使用官方指令安装了swagger-node,并在执行'swagger project create'时选择了Hapi.但是,我现在感到困惑,因为似乎有几个库用于集成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).
hapijs ×10
node.js ×6
javascript ×3
express ×2
frameworks ×1
joi ×1
jwt ×1
logging ×1
routes ×1
swagger ×1
url ×1
url-routing ×1
validation ×1