我正在构建一个node.js webapp,它使用redis连接。我已经将redis凭证存储在数据库中,因此建立redis连接是一项异步任务。
这是我目前app.js的代码:
// app.js
'use strict'
const express = require('express')
const Http = require('http')
const app = express()
const http = Http.createServer(app)
// wait for the event 'ready' to start listening for requests
// otherwise it will return an error
app.on('ready', () =>
http.listen(process.env.PORT, () => console.log(`Server listening on port ${process.env.PORT}`))
)
const Redis = require('./redis')
Redis().then(redis => {
app.set('redis', redis)
app.emit('ready')
})
const Routes = require('./routes')(app)
问题1
将redis连接存储到app变量中是一种好的做法。我将'app'变量传递给我需要的其他模块(例如“路由器”)。我现在挣扎了几个星期如何处理数据库连接。我记录每个redis连接,在这之前,当我启动服务器时,我看到了很多“redis connected”消息,因为我在每个模块中都创建了一个新的redis客户端。现在我只看到一个,它似乎工作。注意:我还使用了一个postgresql数据库,我对这个连接也是这样做的。这两个连接都可以工作,而且我没有看到以前的任何错误(比如连接超时或连接太多)。
这是我的routes.js代码:
// routes.js
const routes = (app) => {
app.get('/set', async (req, res) => {
await app.get('redis').set('foo', 'bar')
res.status(200).json({ response: 'foo set' }) // should output {"response":"foo set"}
})
app.get('/get', async (req, res) => {
let response = await app.get('redis').get('foo')
// should return 'bar'
res.status(200).json({ response }) // should output: {"response":"bar"}
})
}
module.exports = routes
如您所见,在routes.js中,我有一个全局函数,它接受app作为参数,在route函数中,我使用之前通过app.get('redis')建立的redis连接。
问题2
我应该调用吗?如果是,我应该在哪里调用redis.quit()(或者在我的例子中:app.get('redis').quit)?我是这方面的初学者,所以我不知道什么时候应该调用redis.quit()。我是否应该在结尾的每个单独的route函数中调用redis.quit()?或者我应该这样做(在app.js中):
process.on('SIGINT', function() {
app.get('redis').quit();
console.log('redis quit');
});
为我的redis连接设置空闲超时是更好的解决方案吗?
暂无答案!
目前还没有任何答案,快来回答吧!