我有以下JavaScript代码来测试Hapi/Joi验证函数:
var Joi = require('joi');
var schema = { free: Joi.Types.Number().float() };
var value = { free: 3.3333 };
var err = Joi.validate(value, schema);
//err is set if value fails to validate against the schema
if (err) throw err;
Run Code Online (Sandbox Code Playgroud)
验证会引发错误:
Error: the value of free must be an integer
Run Code Online (Sandbox Code Playgroud)
我想知道我做错了什么.我正在使用当前版本的Hapi和Joi.
我有一个数组字段,我想确保在满足条件时它至少具有一个元素:
genre:Joi.array().includes(data.genres).when('field'{is:'fieldValue',then:Joi.required()})
Run Code Online (Sandbox Code Playgroud)
如果我用Joi.required()。min(1)更改了'then'字段,它会抱怨。
我可以和Joi一起做吗?
有没有办法访问全球注册的插件?我读过关于hapi-sequelize的内容,我想将它实现到我的hapi应用程序中.这是文档.它声明您可以使用以下代码全局访问它:
var db = plugin.plugins['hapi-sequelized'].models;
db.Test.create({
email: 'some@email.com',
password: 'alskfjdfoa'
});
我试过把它给我的控制器,但它似乎没有识别插件变量.
刚开始熟悉Hapi.Hapi使用插件为您的应用程序添加组件.我很难理解为什么我会使用插件,当我可以做以下事情:
var lib = require('whatever lib from npm');
Run Code Online (Sandbox Code Playgroud)
两者有什么不同?
如何调整Hapi回复功能,使其仅回复JSON对象?我应该发送它作为普通并发送?我好像没有找到一个好榜样
这里有一些编辑 - 添加了一些示例代码来了解发生了什么.
路线:
server.route({
method: 'GET',
path: '/user/',
handler: function (request, reply) {
var ids = null;
mysqlConnection.query('SELECT ID FROM Users;',function(err,rows,fields){
if(err) throw err;
ids = rows;
// console.log(ids);
reply(ids);
});
}
});
Run Code Online (Sandbox Code Playgroud)
答复:
<html><head></head><body>
<pre style="word-wrap: break-word; white-space: pre-wrap;">[{"ID":1},{"ID":2},{"ID":3},{"ID":4},{"ID":5},{"ID":6},{"ID":7},{"ID":8},{"ID":9},{"ID":10},{"ID":11},{"ID":12},{"ID":13},{"ID":14},{"ID":15},{"ID":16},{"ID":17},{"ID":18},{"ID":19},{"ID":20},{"ID":21}]
</pre></body></html>
Run Code Online (Sandbox Code Playgroud) 新来Hapijs,并试图用它来创建一个使用HTTPS所有请求的应用程序和HTTP重定向到安全connection.The问题是应用程序进去HTTPS模式没有问题,但如果我改变的URL为http服务器没有响应并且不知道原因.
这是我到目前为止所提出的,它可以工作但不适用于HTTP
var connectionOptions = {
port: 3000,
tls: {
key: fs.readFileSync(path.join(__dirname, 'key/key.pem'), 'utf8'),
cert: fs.readFileSync(path.join(__dirname, 'key/cert.pem'), 'utf8')
}
};
var server = new Hapi.Server();
server.connection(connectionOptions);
//This method not called when its HTTP
server.ext('onRequest', function (request, reply) {
if (request.headers['x-forwarded-proto'] === 'http') {
reply.redirect('https://' + request.headers.host +
request.url.path).code(301);
return reply.continue();
}
reply.continue();
});
var routes = require('./routes')(server);
server.route(routes);
if (!module.parent) {
server.start(function () {
console.log('Server running at:', server.info.uri);
});
}
Run Code Online (Sandbox Code Playgroud)
如何强制所有请求为HTTPS.感谢您的帮助
我的API中的一些功能涉及获取POST发送的有效负载输入并将其交给另一个应用程序进行处理.有效负载输入始终作为JSON对象发送,值必须始终为数字.但是,因为JSON对象有数百种不同的变体(因为它们在其他应用程序中匹配的模型越来越多),所以我不可能为验证配置命名每个键和值我在Hapijs中定义的POST路由中的选项.
我希望我可以做这样的事情,但想象一下,必须有更多的黑客攻击:
config: {
validate: {
payload: Joi.object().keys(Joi.number())
}
}
Run Code Online (Sandbox Code Playgroud)
也许有一些方法可以遍历对象并确保值都是数字 - 在validate选项中 - 但感觉它可能效率很低.
在hapi.js API中,他们指定身份验证方案也可以返回工件作为凭证对象的一部分.
什么是身份验证工件以及它们为何有用?是否有一个很好的例子说明为什么hapi团队将其作为API的一部分?
我使用了快递,在那里你可以传递多个方法来传递一个如下的路线:
app.get('/users/,[
validator.validate,
controller.get
]);
Run Code Online (Sandbox Code Playgroud)
然后,每个函数都使用next()回调将控制权传递给数组中的下一个函数.有没有相同的东西可以在hapijs处理程序中完成?我希望我的函数既可以重用也可以像我们对快速路由处理程序一样独立.
谢谢.
如果hapi服务器过载会有什么作用,并且有类似toobusy-js的东西可以通过快速删除一些有错误的请求来防止服务器的影响.
hapijs ×10
node.js ×6
validation ×2
https ×1
javascript ×1
joi ×1
json ×1
node-modules ×1
plugins ×1
security ×1