我有一个简单的节点应用程序,它使用JSForce连接到Salesforce来推送/查询我们的Salesforce帐户。我使用的是用户名/密码验证而不是OAuth。
它现在正常工作,但它还处于开发阶段,我注意到我的页面加载速度非常慢,可能是因为在每次加载时我都建立了连接,登录,并通过中间件将连接附加到req。
router.use('/*time*',
sftools.conn, // Create connection to Salesforce
sftools.login, // Login to SalesForce
sftools.picklist //populate res.locals.roles with SalesForce Roles
)
中间件代码示例:
const jsforce = require('jsforce')
exports.conn = (req, res, next) => {
req.conn = new jsforce.Connection({
loginUrl: process.env.SF_LOGINURL
})
next()
}
exports.login = (req, res, next) => {
req.conn.login(process.env.SF_USER, process.env.SF_PASS, (err) => {
if(err) return next(err)
next()
})
}
同样,这可行,但我认为我应该建立连接并在全球范围内登录,我只是不确定如何准确地执行此操作以及它应该放在我的应用程序中。即使我这样做,我还应该将conn分配给请求,还是直接访问它?第一个节点应用......任何想法都表示赞赏。
答案 0 :(得分:1)
如果您希望连接在处理完请求后保持打开状态,则应将连接处理提取到专用模块/文件。
从节点内调用'require'将始终返回相同的实例:
(...)每次调用require('foo')将获得完全相同的返回对象,如果它将解析为同一个文件。 多次调用require('foo')可能不会导致模块代码多次执行。 (...)
Please check the nodejs documentation for further information:
考虑到这一点,您可以创建一个专用的处理程序文件......
// sfConnectionHandler.js
const jsforce = require('jsforce')
let currentConnection
function createConnection() {
currentConnection = new jsforce.Connection({ loginUrl: process.env.SF_LOGINURL })
currentConnection.login(process.env.SF_USER, process.env.SF_PASS, (err) => {
// your error handling
})
// use promises, call next(), ...
}
function connection() {
// assert whatever you feel is necessary (is alive, logged in, ...)
if(!currentConnection) {
createConnection();
}
return currentConnection;
}
module.exports = connection;
...然后在您想要使用连接的地方需要此文件。
const sfConnectionHandler = require('./sfConnectionHandler');
sfConnectionHandler.connection.query('...');
不得将连接附加到每个请求。只要没有特殊的联系,我就无法想到任何优势。