【问题标题】:Best way to set up JSForce Connection middleware in Node/Express App在 Node/Express App 中设置 JSForce Connection 中间件的最佳方式
【发布时间】:2017-07-13 11:52:15
【问题描述】:

我有一个简单的节点应用程序,它使用 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 分配给请求,还是直接访问它?第一个节点应用程序......任何想法都值得赞赏。

【问题讨论】:

    标签: node.js express salesforce


    【解决方案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('...');
    

    连接不能附加到每个请求。我想不出有什么好处,只要没有特殊关系。

    【讨论】:

    • 您能不能对// use promises, call next(), ... 部分提供一些解释?我也在尝试同样的方法,我想我可能会错过这个,因为你的答案对我不起作用..
    • @KostasTsakalidis 我的回答是针对作者描述的中间件调用。在那里,一旦你当前的中间件步骤完成,你总是必须打电话给next(),我假设在建立连接后就是这种情况。如果您调用的方法(例如此处的登录)是异步的,则必须使用 promise 等待此调用完成,然后再调用下一个中间件。我想这就是我所指的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 2020-05-18
    相关资源
    最近更新 更多