服务器端点仅在第一次调用时运行promise函数,之后立即返回

时间:2018-07-18 14:17:25

标签: javascript node.js restify

(如果有区别,我正在使用Restify而不是Express。)

每次碰到端点都会按预期工作:

server.post('/myendpoint', (req, res, next) => {
    setTimeout(() => {
        console.log('done');
        res.send();
        return next();
    }, 3000);
});

这仅在第一次命中端点时起作用,然后在再次命中端点时立即返回而不运行promise(未看到console.log):

// myPromise.js
module.exports = new Promise((resolve, reject) => {
    // doesn't run when the endpoint is hit a 2nd time
    setTimeout(() => {
        console.log('done');
        resolve();
    }, 3000);
});

server.post('/myendpoint', async (req, res, next) => {
    const myPromise = require('./myPromise');
    await myPromise;
    res.send();
    return next();
});

我想这段代码几乎是一样的。我想念什么吗?

1 个答案:

答案 0 :(得分:2)

模块由require()缓存。因此,第一次加载模块时,模块代码将运行。之后,module.exports值已被缓存,并且先前的结果将立即返回。您的模块初始化代码将不会再次运行。因此,第二次加载模块时,第一次创建的承诺将立即返回。

如果您希望每次都运行一些代码,则应该导出一个函数,然后可以在每次运行时调用该函数。

// myPromise.js
// export a function
module.exports = function() {
  return new Promise((resolve, reject) => {
    // doesn't run when the endpoint is hit a 2nd time
    setTimeout(() => {
        console.log('done');
        resolve();
    }, 3000);
  });
}

server.post('/myendpoint', async (req, res, next) => {
    // note we are calling the exported function here
    const myPromise = require('./myPromise')();
    await myPromise;
    res.send();
    return next();
});