我正在使用hapi.js创建我的第一个node.js REST Web服务.我很好奇处理错误的最佳方法,让我们从我的dao层说出来.throw
在我的dao层中做他们然后只是try/catch
阻止他们处理它们并在我的控制器中发回错误,或者有一个更好的方式,酷孩子正在处理这个?
路线/ task.js
var taskController = require('../controllers/task');
//var taskValidate = require('../validate/task');
module.exports = function() {
return [
{
method: 'POST',
path: '/tasks/{id}',
config : {
handler: taskController.createTask//,
//validate : taskValidate.blah
}
}
]
}();
Run Code Online (Sandbox Code Playgroud)
控制器/ task.js
var taskDao = require('../dao/task');
module.exports = function() {
return {
/**
* Creates a task
*
* @param req
* @param reply
*/
createTask: function createTask(req, reply) {
taskDao.createTask(req.payload, function (err, data) {
// TODO: Properly handle errors …
Run Code Online (Sandbox Code Playgroud) 我想用实验室测试hapi路由,我正在使用mysql数据库.
使用Server.inject测试路由的问题是我无法模拟数据库因为我没有调用包含处理函数的文件,所以如何在处理程序中注入模拟数据库?
我是*Hapi*框架的新手.在开发过程中,每当我对代码进行任何更改时,我都必须重新启动hapi服务器.
对于视图部分,我可以添加一个选项{isCached: false}
,使视图每次都读取最新的html文件.但是,是否有一个简单的设置,使其在更改时自动重新加载代码?
更新:
感谢dylants的建议,Nodemon非常棒.
但是,在我的应用程序中有一个selenium-standalone子进程,每当nodemon
重新启动时,它都会生成一个错误日志....Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again...
我试过https://github.com/remy/nodemon#controlling-shutdown-of-your-script,它没有帮助.
如果我有两个字段,我只想验证至少一个字段是非空字符串,但是当两个字段都是空字符串时失败.
这样的事情无法验证
var schema = Joi.object().keys({
a: Joi.string(),
b: Joi.string()
}).or('a', 'b');
Run Code Online (Sandbox Code Playgroud)
验证时
{a: 'aa', b: ''}
Run Code Online (Sandbox Code Playgroud)
该or
条件只测试了两种关键的存在a
或b
,但确实为条件测试是否a
还是b
如此.Joi.string()
空字符串会失败.
以下是一些要展示的测试用例的要点
在路由上使用config.validate选项并且由于验证请求失败时,hapi会返回如下错误:
{
"statusCode": 400,
"error": "Bad Request",
"message": "child \"weight\" fails because [\"weight\" is required]",
"validation": {
"source": "payload",
"keys": [
"weight"
]
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法发送不同的格式化验证错误?
我正在使用hapi v6.11.1并且一直试图有条件地将来自我的hapi.js服务器的请求重定向到另一台服务器.这是我到目前为止所做的:
server.on('onRequest',function(request,reply) {
if(request.headers.customHeader) { // redirect only if header found
reply('custom header redirection').redirect('http://someurl.com');
return;
}
reply();
});
Run Code Online (Sandbox Code Playgroud)
但上面的解决方案将无法工作,仍然命中我的服务器而不是我指定的服务器.
我尝试在'onRequest'处理程序上执行reply.proxy()并得到以下错误:
错误:未捕获错误:如果解析了有效负载或输出不是流或数据,则无法进行代理
在尝试找出解决方案时,我从hapi.js文档中发现了以下内容:
仅在处理程序方法中可用,并且仅在reply(),reply.file(),reply.view(),reply.close(),reply.proxy()或reply.redirect()之一之前调用.
但问题是我有大约100条路线,我现在必须更改每个请求的处理程序以允许代理,如果我的条件得到满足,我不想这样做.
如果有以下任何一种可能,我会很高兴的:
将请求从'onResponse'重定向到另一个域,而不是更改处理函数.
服务器方法,可以允许我配置所有路由配置并在其上注入代理重定向.
谢谢.
我正在使用HapiJs Restful Web服务并尝试启用cors,因此即使来自不同域的任何客户端也可以使用我的服务.我在服务器连接对象中尝试了cors = true但没有工作.
希望使用HapiJS作为我们的API服务器.我们需要细粒度的用户权限,例如"用户A可以编辑字段B""用户C可以查看字段D"以获得给定的模型/资源.
在我们开始构建之前,我一直在寻找是否已经完成了与Hapi兼容的类似事情.
我正在尝试将我的Express应用程序迁移到hapi.js,并且我的路线出现问题.我只想要2 GET:我的索引'/',以及不是'/'的所有内容都重定向到'/'.
使用Express我有这个:
// static files
app.use(express.static(__dirname + '/public'));
// index route
app.get('/', function (req, res) {
// whatever
}
// everything that is not /
app.get('*', function(req, res) {
res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)
我有hapi.js的问题,以获得相同的行为.我的"静态路"看起来像这样:
server.route({
method: 'GET',
path: '/{path*}',
handler: {
directory: {
path: 'public',
listing: false
}
}
});
Run Code Online (Sandbox Code Playgroud)
而我的"404道路"将是:
server.route({
method: 'GET',
path: '/{path*}',
handler: function (request, reply) {
reply.redirect('/');
}
});
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Error: New route /{path*} conflicts with existing /{path*}
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
我开始使用Hapi nodejs框架.我使用的是"hapi@17.2.0",这是我在server.js中的代码来启动应用程序.
'use strict';
const Hapi = require('hapi');
const server = new Hapi.Server();
server.connection({ port: 3000, host: 'localhost' });
server.route({
method: 'GET',
path: '/',
handler: function (request, reply) {
reply('Hello, world!');
}
});
server.start((err) => {
if (err) {
throw err;
}
console.log(`Server running at: ${server.info.uri}`);
});
Run Code Online (Sandbox Code Playgroud)
node server.js
从终端运行我的项目之后,它会抛出错误,如下所示.
/var/www/html/hello_hapi/server.js:6
server.connection({ port: 3000, host: 'localhost' });
^
TypeError: server.connection is not a function
at Object.<anonymous> (/var/www/html/hello_hapi/server.js:6:8)
at Module._compile (module.js:612:30)
at Object.Module._extensions..js (module.js:623:10)
at Module.load (module.js:531:32)
at tryModuleLoad (module.js:494:12)
at …
Run Code Online (Sandbox Code Playgroud) hapijs ×10
node.js ×8
javascript ×3
redirect ×2
acl ×1
joi ×1
node-mysql ×1
permissions ×1
proxy ×1
rest ×1
sequelize.js ×1