Hapi.js Catbox Redis返回“server.cache不是函数”

时间:2016-02-12 17:28:03

标签: node.js caching redis hapijs

所以我99%肯定我只是搞砸了一些愚蠢的东西。

我正在尝试设置catbox来将对象缓存到redis。我已经启动并运行了,我可以使用RDM(sql pro就像redis的实用程序)来使用它,但Hapi没有合​​作。

我像这样注册redis catbox缓存:

const server = new Hapi.Server({
cache: [
{
  name: 'redisCache',
  engine: require('catbox-redis'),
  host: 'redis',
  partition: 'cache',
  password: 'devpassword'
}
]
});

我在server.js中这样做。在这段代码之后,我继续注册一些插件并启动服务器。我还在文件末尾导出服务器

module.exports = server;

然后在我的路线文件中,我试图建立一个像这样的测试路线:

{
    method: 'GET',
    path: '/cacheSet/{key}/{value}',
    config: { auth: false },
    handler: function(req, res) {
        const testCache = server.cache({
            cache: 'redisCache',
            expireIn: 1000
        });

        testCache.set(req.params.key, req.params.value, 1000, function(e) {
            console.log(e);
            res(Boom.create(e.http_code, e.message));
         })
        res(req.params.key + " " + req.params.value);
    }
},

注意:我的路由位于外部文件中,并导入到我注册的server.js中。

如果我注释掉这条路线上的所有缓存内容,路线运行正常并返回我的参数。

如果我用缓存的东西运行它,起初我得到“服务器未定义”。所以我添加了

const server                        = require('./../server.js');

导入服务器。

现在当我运行它时,我得到“server.cache不是函数”和500错误。

我不明白我做错了什么。我的猜测是我正在导入服务器,但也许它是没有设置所有配置的对象,所以它无法使用.cache方法。然而这似乎是错误的,因为.cache应该始终是默认的内存缓存方法,所以即使我的缓存注册还没有激活,server.cache理论上应该仍然是一种方法。

我知道它必须是基本的东西我搞砸了,但是什么?

1 个答案:

答案 0 :(得分:1)

我是对的。我做了一些愚蠢的事。这与我导出服务器的方式有关。我修改了我的结构以取出初始服务器创建并使其更加模块化。现在我只是像这样导出JUST服务器:

public class MainActivity extends AppCompatActivity {

    private List<ListItem> items;
    private ArrayAdapter<String> adapter;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });


        items.add(new ListItem("test", "https://google.com"));  

        listView = (ListView) findViewById(R.id.listView);

        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);

        listView.setAdapter(adapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


}

public class ListItem {

    private long id;
    private String url;
    private String title;

    public ListItem(String title, String url) {
        this.title = title;
        this.url = url;
    }

    public String getUrl() {
        return url;
    }

    @Override
    public String toString() {
        return title;
    }
}

然后我将它导入我的主服务器文件(现在是index.js以前的server.js),一切运行正常。我也可以将其导入任何其他文件(在本例中为我的路径文件)并访问服务器以获取适当的方法。

Redis很高兴存放钥匙,Hapi很高兴不给我错误。

离开这里以防万一其他人遇到像这样的愚蠢错误。