我需要接受一个手机号码作为网络服务的输入,但我在使用Joi框架验证时面临以下问题.
Joi说:
Error: pattern must be a RegExp
at Object.exports.assert (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/ragchews/node_modules/joi/node_modules/hoek/lib/index.js:524:11)
at internals.String.regex (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/ragchews/node_modules/joi/lib/string.js:107:10)
at /home/gaurav/Gaurav-Drive/code/nodejsWorkspace/ragchews/src/validators/userValidator.js:10:40
at Object.<anonymous> (/home/gaurav/Gaurav-Drive/code/nodejsWorkspace/ragchews/src/validators/userValidator.js:13:2)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
Run Code Online (Sandbox Code Playgroud)
用于验证:
var userProfileValidation = function(){
return {
payload : {
uid: Joi.string().required().alphanum().length(userConfigs.UID_LENGTH),
mobile_num: Joi.string().required().regex('^[0-9]*$').length(userConfigs.RMN_LENGTH) //for this guy
}
};
}();
Run Code Online (Sandbox Code Playgroud)
我检查了正则表达式freeformatter,它似乎为atleast一些投入正常工作.我不明白为什么joi会抛出这个错误.
我试图从一个相互依赖的查询字符串验证可选参数.换句话说,当添加参数A时,还需要参数B. 这两个参数都是可选的,因此当它们都没有提供时,验证也应该通过.
应该通过:
?a=1&b=2&c=0
?c=0
Run Code Online (Sandbox Code Playgroud)
应该失败:
?a=1&c=0
?b=2&c=0
Run Code Online (Sandbox Code Playgroud)
有人能给我一个关于如何解决这个问题的示例模式吗?
根据文档https://hapijs.com/api/16.0.1#route-configuration,路由方法可能不是“HEAD”类型,但我不明白为什么我不能覆盖该行为。
我想使用 hapi 创建一个文件下载 API。不使用res.download()
,如何使用reply()
?
使用body-parser + expressjs是可以的.但我的问题是:如何在Hapijs中获取原始请求体的缓冲区?
我正在谈论的事情就像buf
身体解析器npm包的这个函数中的参数:verify(req,res,buf,encoding)
我在messenger-platform-samples例子中需要它来实现这个功能:
function verifyRequestSignature(req, res, buf) {
var signature = req.headers["x-hub-signature"];
if (!signature) {
console.error("Couldn't validate the signature.");
} else {
var elements = signature.split('=');
var method = elements[0];
var signatureHash = elements[1];
var expectedHash = crypto.createHmac('sha1', APP_SECRET)
.update(buf)
.digest('hex');
if (signatureHash != expectedHash) {
throw new Error("Couldn't validate the request signature.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:我需要在我的中间件中使用它server.ext()
,如下所示:
server.ext({
type: 'onRequest',
method: (request, reply) => {
var signature = request.headers["x-hub-signature"];
if (!signature) …
Run Code Online (Sandbox Code Playgroud) 我开始使用 hapijs 并用它设置了一个新的练习项目以进行更深入的研究。我成功设置了一次,它工作正常,但在运行 node server.js 时突然开始抛出错误,如下所示。
/Library/WebServer/Documents/hello_hapi/node_modules/hapi/lib/server.js:107
decorate(type, property, method, options = {}) {
^
SyntaxError: Unexpected token =
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:373:25)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/Library/WebServer/Documents/hello_hapi/node_modules/hapi/lib/index.js:5:16)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 hapi.js 应用程序中验证由 stripe 发送的 webhook。我已按照此处详细说明的说明进行操作:
https://stripe.com/docs/webhooks/signatures
(我显然没有在这里发布我的端点秘密:)
<!-- language: lang-js -->
const enpointSecret = ######;
const sig = _.fromPairs(request.headers["stripe-signature"].split(',')
.map(s => s.split('=')));
// produces object eg { t: '1111', v1: '111111..', v0: '...'} etc
const signed_payload = `${sig.t}.${JSON.stringify(request.payload)}`;
const hmac = crypto.createHmac('sha256', endpointSecret)
.update(signed_payload)
.digest('hex');
Run Code Online (Sandbox Code Playgroud)
生成的 hmac 与标头 (sig.v1) 中的签名不匹配。我无法弄清楚我做错了什么......
我正在本地开发 - 并使用 ngrok,以便我可以测试我的 webhooks。这可能是一个问题吗?谢谢
我有graphql apollo-server-hapi
。我尝试添加缓存控制,如下所示:
const graphqlOptions = {
schema,
tracing: true,
cacheControl: true,
};
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在架构基础上添加缓存选项时:
type Author @cacheControl(maxAge: 60) {
id: Int
firstName: String
lastName: String
posts: [Post]
}
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
Error: Unknown directive "cacheControl".
Run Code Online (Sandbox Code Playgroud)
你能帮忙吗,在架构上应用缓存控制的正确方法是什么?
我按照下面的说明进行操作,但似乎不起作用。
我正在使用 @hapi/joi 进行快速验证和卫生。验证时,某些验证器不工作。在这个中,trim() 不仅不会验证输入字符串开头和结尾的空格,而且它也不会修剪它,因为它应该默认将 convert 设置为 true。但是,检查有效电子邮件和需要两者都可以工作并抛出各自的错误。我也试过小写(),但没有验证或将其转换为小写。
const Joi = require("@hapi/joi");
const string = Joi.string();
const localRegistrationSchema = Joi.object().keys({
email: string
.email()
.trim()
.required()
.messages({
"string.email": "Email must be a valid email address",
"string.trim": "Email may not contain any spaces at the beginning or end",
"string.empty": "Email is required"
})
});
Run Code Online (Sandbox Code Playgroud)