javascript - 函数什么时候应该在 hapijs 路由调用中返回

标签 javascript node.js hapi.js

我有两个不同的示例,一个来自 makemehapi(某种互动类(class)),另一个来自 hapi.js 官方网站。第一个看起来像这样 -

var Hapi = require('hapi');    
var server = new Hapi.Server();

server.connection({
    host: 'localhost',
    port: Number(process.argv[2] || 8080)
});

server.route({
    method: 'GET',
    path: '/',
    handler: function (request, reply) {
        reply('Hello hapi');
    }
});

server.start(function () {});

只需查看正在调用的 server.route 方法。处理程序有一个调用 reply(...); 并且不返回的匿名函数。现在 hapijs 网站提到了以下调用:

server.route({
    method: 'GET',
    path:'/', 
    handler: function (request, reply) {

        return reply('hello world');
    }
});

这里我假设 reply 语句的值被返回并且示例的其余部分相同。那么这两种方法是一样的吗?调用 return 或不调用它在这里没有什么区别(我都执行过)但在其他情况下会重要吗?也许等式中也有某种形式的中间件,它们是我们不调用 return 的原因吗?

最佳答案

hapi 不使用任何来自您的处理程序的返回值(参见 the code )。您的 2 个样本在功能上是等效的。

那为什么要返回呢?

在调用回调时添加 return(reply() 接口(interface))只是一个很好的做法,它标志着您打算让函数停止执行在那时候。它可以防止任何人在该行之后添加要执行的代码。

From hapi style guide :

  • Callbacks should always be called with explicit return

对于这个简单的例子来说,这似乎毫无意义,但这是一个养成的好习惯。它可能会在更复杂的场景中挽救您的生命,确保回调仅被调用一次并具有正确的值。

查看这两个代码示例以了解我的意思:

错了!

const diffuseBomb = function (person, callback) {

    if (person === 'james bond') {
        callback('PHEW! We\'re saved!');
    }

    callback('BOOOM!');
};

diffuseBomb('james bond', (sound) => console.log(sound));

正确!

const diffuseBomb = function (person, callback) {

    if (person === 'james bond') {
        return callback('PHEW! We\'re saved!');
    }

    return callback('BOOOM!');
};

diffuseBomb('james bond', (sound) => console.log(sound));

关于javascript - 函数什么时候应该在 hapijs 路由调用中返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37416327/

相关文章:

javascript - 我需要将页面滚动到底部,直到用户向上滚动

javascript - class 和 id 名称拼写错误的预防工具

node.js - 如何在 mongoDB 集合中分别保存日期和时间?

javascript - 如何将时间字符串(例如 "8:02 AM")转换为可排序字段

node.js - Hapi.js Catbox Redis 返回 "server.cache is not a function"

javascript - hapi joi 过滤器有效值

javascript - 从 GWT 调用框架 js

javascript - 在新窗口中使用 Highcharts 绘制图表

javascript - 同时 Node 以状态 1 退出。这会停止 Teamcity,导致其认为测试失败

node.js - RethinkDB 连接 "must be open"但永远不会关闭