我有一个简单的节点应用程序,它使用JSForce连接到Salesforce,以推送/查询Salesforce帐户。我使用的是用户名/密码身份验证,而不是OAuth。
它现在运行良好,但仍然在dev中,而且我注意到我的页面加载非常慢,可能是因为在每次加载时,我都要建立一个连接,登录,并通过中间件将连接附加到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分配给请求,还是直接访问它呢?第一个节点应用..。任何想法都会受到赞赏。
发布于 2017-07-14 13:28:41
如果您希望您的连接在请求处理之后仍然保持打开状态,则应该将连接处理解压缩到一个专用模块/文件中。
从节点内部调用“require”将始终返回相同的实例:
(...)每个需要(‘foo’)的调用都将得到完全相同的对象返回,如果它将解析到同一个文件。需要(“foo”)的多个调用可能不会导致多次执行模块代码。(...)
考虑到这一点,您可以创建一个专用的处理程序文件.
// 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('...');不能将连接附加到每个请求。我想不出有什么好处,只要没有特殊的联系。
https://stackoverflow.com/questions/45079825
复制相似问题