这是我的策略,它在server.register()上定义.我将我的工作基于一个教程,它实际上是从它复制但它不起作用.
server.auth.strategy('standard', 'cookie', {
password: 'somecrazycookiesecretthatcantbeguesseswouldgohere', // cookie secret
cookie: 'app-cookie', // Cookie name
isSecure: false, // required for non-https applications
redirectTo: '/login',
ttl: 24 * 60 * 60 * 1000 // Set session to 1 day
});
server.auth.default({
strategy: 'standard',
mode: 'required',
scope: ['admin']
});
Run Code Online (Sandbox Code Playgroud)
这是我发生错误的登录路由:
server.route({
method: 'POST',
path: '/login',
config: {
auth: false,
validate: {
payload: {
email: Joi.string().email().required(),
password: Joi.string().min(2).max(200).required()
}
},
handler: function (request, reply) {
getValidatedUser(request.payload.email, request.payload.password)
.then(function (user) {
if (user) {
//ERROR …
Run Code Online (Sandbox Code Playgroud) 目前,我正在使用Node hapijs框架开发REST API .API部署在Heroku上.
API中有一个GET端点,它发出get请求以从第三方检索数据并在发送回复之前处理数据.此特定端点不时超时.当端点超时时,Heroku返回H12错误.一旦超时,对该端点的后续请求将导致H12错误.我必须重新启动Heroku上的应用程序才能使该端点再次运行.API中的任何其他端点都不会受到此错误的任何影响,即使发生错误,也可以继续正常工作.
在我的调试过程中并查看日志,似乎有时候没有从第三方API返回响应,从而导致错误.
我尝试了以下解决方案来尝试解决问题:
我正在使用请求库来发出请求.因此,我尝试将超时设置为5000毫秒,作为传递给请求的选项的一部分.它有时工作...触发超时并且端点发送与请求关联的超时错误.这是我想要的行为,因为后续的端点请求工作.但是,有时候不会触发请求超时,但Heroku仍然会返回H12错误(总是在30秒后,默认为Heroku).之后,对该端点的后续请求将返回H12错误(也在30秒后).似乎某些进程在Heroku上"卡住",并且在我重新启动应用程序之前不会终止.
我已经尝试在hapi.js路由配置对象中添加超时.我得到与上面相同的结果.
我继续做研究,并怀疑这些问题与这里和这里给出的描述有关.似乎在应用程序服务器级别设置一个可以向Heroku工作者发送SIGKILL的超时可能会起作用.在Ruby中看起来相当简单,但我找不到有关如何在Node中执行此操作的更多信息.
非常感谢任何见解.我知道向第三方发出请求时可能会发生超时.这不是问题.问题是端点似乎在超时后被"卡住"在Heroku上并且它变得没有响应.
谢谢您的帮助!
我正在使用nodejs + mongodb。在上传图片时,如果前端大小超过50kb,则不允许这样做。我想将其设置为最大5MB,以便可以在大小为1MB或2MB的情况下上传图像。我尝试了很多方法,但我仍然没有找到适当的解决方案。我检查了此链接[Joi / hapi] [1]
[1]:https://github.com/hapijs/joi/blob/v9.0.1/API.md,但仍然无法正常工作。有人可以帮我吗
这是我的图式
const nameofSchema = Joi.object().keys({
description: Joi.string(), // .required(),
image: Joi.string().max(500000),
category: Joi.string(),
namesasd: Joi.string().regex(/^[a-z][a-z0-9-]*$/),
title: Joi.string(), // .required(),
price: Joi.number().integer(),
tag: Joi.object().keys({
tag_name: Joi.string()
})
});
Run Code Online (Sandbox Code Playgroud)
在此图像中,我想将最大限制大小设置为5mb。(上传最大5mb的图像)
以下是路线
create: {
description: '',
path: '/',
verb: 'post'
},
Run Code Online (Sandbox Code Playgroud) 我在我们的应用程序中使用 hapi-swagger,其中一个 API 尝试使用自定义标头,但是当我使用自定义标头调用该 API 时出现以下错误
{
"statusCode": 400,
"error": "Bad Request",
"message": "Invalid request headers input"
}
Run Code Online (Sandbox Code Playgroud)
在我使用带有验证器的标头的 API 下方。
{
method: 'POST',
path: '/v1/testapi',
config: {
description: 'Greet user',
notes: ['Use to greet a user'],
tags: ['api'],
handler: function ( request, h ) {
console.log('sending response...');
return h.response('OK');
},
validate: {
headers: {
name: Joi.string().required()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是我们正在使用的版本。
"hapi": "17.2.2",
"hapi-swagger": "9.1.1",
"joi": "13.1.2",
我提前道歉 - 这个问题需要一些背景知识,这可能是冗长的:
我正在尝试构建一个可与 PouchDb 脱机工作的应用程序。PouchDb 将与 Cloudant 同步。
使用的技术:Hapi、SQL、Vue、Cloudant、PouchDb
我已经构建了一个小的 hapi.js 服务来注册/验证用户。当“帐户所有者”注册时 - 他们将作为新用户添加到 SQL 数据库中。
使用 Cloudants API,我提供了一个新数据库(使用随机名称),并在数据库上设置了安全性,以便新用户可以访问。
我将安全性(数据库名称、用户名和密码)作为元数据保存回 SQL 数据库中的用户。
与此处非常相似的方法:https : //www.bennadel.com/blog/3208-provisioning-cloudant-couchdb-databases-from-auth0-for-a-database-per-user-architecture-in-angular-2 -4-1.htm(确实,我基于以上内容)。
当“帐户所有者”登录时,查询 SQL 数据库 - 检索元数据并将其发送到客户端 vue 应用程序。然后使用 Cloudant 数据库名称、用户名和密码填充 PouchDB 远程字符串。
例如:
const remoteDB = new PouchDB(`https://${name}:${pass}@0000-0000-bluemix.cloudant.com/${DBname}`);
Run Code Online (Sandbox Code Playgroud)
这一切都有效:PouchDB 可以与 Cloudant 对话 - 并且数据可以毫无问题地进出。
“帐户所有者”能够授予其他人(“员工”)对其 cloudantDB 的读/写访问权限。当他们添加新的职员时,职员会被添加到 SQL 数据库中。使用 cloudants API,我为该用户创建了新的安全凭证,以便他们可以访问 DB-(我不创建新的 DB)并将它们保存到 SQL 数据库中的 Staff Member 作为元数据...
新员工会收到一封电子邮件 - 他们在 SQL db 上设置了他们的用户名和密码,然后可以登录。Cloudant 元数据被拾取......等等...... PouchDB / Couchdb 相互交谈 - 这也作品。
最初我有点担心将这个元/凭据发送给客户端 …
我有模型一,乙,和Ç。
A具有与B&C的hasMany关联(并且B&C具有回到A的belongs关联)
我想返回A的记录,其中B.b_column ='b'或C.c_column ='c'。
我当前的方法是尝试使用required:在哪里的false,但这仅返回A及其关联的所有记录(如果它们存在)。我还尝试在关联上使用split:true,但它似乎仍带回了比我想要的更多的记录。
var results = await A.all({
include: [
{
model: B, as: "Bs",
where: { b_column: "b"},
separate: true
},
{
model: C, as: "Cs",
where: {c_column: "c"},
separate: true
},
]
});
Run Code Online (Sandbox Code Playgroud) 我听了很多关于 hapi api 框架的信息,所以我从它开始。虽然文档非常可靠,但我仍然无法解决我的问题:
我正在尝试发送一些表单数据并希望在实际处理之前对其进行验证,因此我使用 hapi 强大的验证实用程序并收到以下错误:
?[31m
[1] validation is not allowed?[0m
at Object.exports.assert (E:\repository\simpleHapiApp\node_modules\hapi\node
_modules\hoek\lib\index.js:425:11)
at Object.exports.assert (E:\repository\simpleHapiApp\node_modules\hapi\lib\
schema.js:15:10)
at new module.exports.internals.Route (E:\repository\simpleHapiApp\node_modu
les\hapi\lib\route.js:46:12)
at E:\repository\simpleHapiApp\node_modules\hapi\lib\router.js:110:25
at Array.forEach (native)
at E:\repository\simpleHapiApp\node_modules\hapi\lib\router.js:107:17
at Array.forEach (native)
at internals.Router.add (E:\repository\simpleHapiApp\node_modules\hapi\lib\r
outer.js:104:13)
at internals.Server._route (E:\repository\simpleHapiApp\node_modules\hapi\li
b\server.js:471:18)
at internals.Server.route (E:\repository\simpleHapiApp\node_modules\hapi\lib
\server.js:465:10)
Run Code Online (Sandbox Code Playgroud)
我的代码如下所示:
server.route({
method: 'POST',
path: '/apis/login',
handler: empApi.login,
config:{
validation:{
payload: {
username: joi.string().min(3).max(20).required(),
password: joi.string().alphanum().required()
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
请指出错误在哪里。
我正在尝试在同一路由上验证两个不同的有效负载模式.两个有效选项是:
validate: {
payload: {
email: Joi.string().required(),
password: Joi.string().required()
}
}
Run Code Online (Sandbox Code Playgroud)
和
validate: {
payload: {
token: Joi.string().required()
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用and
和or
函数的组合非常接近,但它允许所有三个作为有效负载传递:
validate: {
payload: Joi.object().keys({
email: Joi.string().required(),
password: Joi.string().required(),
token: Joi.string().required()
}).and('email', 'password').or('token', 'email', 'password')
}
Run Code Online (Sandbox Code Playgroud) 我有一个post调用,可以将有效负载作为单个JS
对象以及对象数组将其保存到db.如何编写模式以验证此类有效负载?
JS对象
{
label: 'label',
key: 'key',
help_text: 'text'
}
Run Code Online (Sandbox Code Playgroud)
要么
[
{
label: 'label1',
key: 'key1',
help_text:'text1'
},
{
label: 'label2',
key: 'key2',
help_text:'text2'
}
]
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Hapi 的插件Crumb来实施针对 CSRF 攻击的解决方案,但似乎我没有得到解决方案的流程。我可以简单地在每个 http 响应中设置一个令牌作为 cookie。问题来了,如果客户端发出令牌,REST 如何验证 CSRF 令牌?REST 后端如何理解此随机字符串对该请求有效而另一个随机字符串无效?
我正在将一个Hapi项目移植到v17,并在迁移到异步/等待时遇到Mongoose的一些问题.
使用'await'的任何代码,在模型(mongoose)上,对象例如:
const result = await User.findOne({email: email}).exec();
Run Code Online (Sandbox Code Playgroud)
运行'node server.js'时出现以下异常
await User.findOne({}).exec();
^^^^^
SyntaxError: await is only valid in async function
at new Script (vm.js:74:7)
at createScript (vm.js:246:10)
at Object.runInThisContext (vm.js:298:10)
at Module._compile (internal/modules/cjs/loader.js:670:28)
at Object.Module._extensions..js
(internal/modules/cjs/loader.js:713:10)
at Module.load (internal/modules/cjs/loader.js:612:32)
at tryModuleLoad (internal/modules/cjs/loader.js:551:12)
at Function.Module._load (internal/modules/cjs/loader.js:543:3)
at Module.require (internal/modules/cjs/loader.js:650:17)
at require (internal/modules/cjs/helpers.js:20:18)
Run Code Online (Sandbox Code Playgroud)
我正在运行节点v10.2.0和mongoose 5.1.2并且无法理解为什么我收到错误.
该mongoosejs文件明确指出,应该使用EXEC()使用异步何时返回承诺/等待是说这里
有什么建议?
我在服务器端使用 HapiJs 并希望根据角色进行路由配置,我想限制用户访问某些端点
var Hapi = require('hapi');
var server = new Hapi.Server();
server.connection({ port: 8000 });
server.route({
method: 'GET',
path: 'api1',
handler: function (request, reply) {
reply('Hello, world!');
}
});
server.route({
method: 'GET',
path: 'api2',
handler: function (request, reply) {
reply('Hello');
}
});
server.route({
method: 'GET',
path: 'api3',
handler: function (request, reply) {
reply('Hello');
}
});
const parseHeader = (request, h) => {
const { role } = JSON.parse(request.headers["roles"]);
};
server.ext("onRequest", parseHeader);
server.start(function () {
console.log('Server running at:', server.info.uri);
}); …
Run Code Online (Sandbox Code Playgroud) hapijs ×12
node.js ×10
javascript ×4
joi ×3
api ×1
cloudant ×1
couchdb ×1
csrf ×1
hapi-swagger ×1
heroku ×1
mongoose ×1
postgresql ×1
sequelize.js ×1
swagger-ui ×1
timeout ×1
token ×1
validation ×1
vue.js ×1
vuejs2 ×1