0

我正在编写一个 Koa 中间件,它在对服务器的每个请求时,分析来自服务器上文件的一些输入,并通过 websocket(使用https://www.npmjs.com/package/ws)将其发送到客户端.

这一切都按预期工作,除了一个问题。数据(作为分析文件输入的结果)正确更新,但不会在 websocket 回调范围内更新。

const websocket = new WebSocket.Server({ port: 8082 });

const sourceAST = parseJS();
const conditionResults = getConditionResults(sourceAST);

console.log('handling request', conditionResults); // <-- updates as expected every time

websocket.on('connection', ws => {
  console.log(conditionResults); // <-- not updated :(
  ws.send(
    JSON.stringify({
      type: 'feedback-updated',
      feedback: conditionResults,
    }),
  );
});

我似乎无法弄清楚为什么 ws 回调中的 conditionResults 在第一次运行时被冻结,为什么每次运行此代码时它都不会更新(在每个请求上)。

编辑:对于上下文,上面的代码片段位于这样的中间件函数中:

myMiddleware = async (ctx, next) => {
  await next();
  // my code snippet above
}

中间件在 Koa 中运行如下:

app.use(myMiddleware);
4

1 回答 1

0

如果您的中间件功能可以由另一个进程以及websocket 消息启动,那么这样的事情应该可以工作:

const websocket = new WebSocket.Server({port: 8082});

let sourceAST;
let conditionResults;

// Triggered by websocket message
websocket.on('message', data => {
    doThings()
});

// Triggered by your middleware
myMiddleware = async (ctx, next) => {
    await next();

    doThings()
};

function doThings () {
    sourceAST = getConditionResults(sourceAST);
    conditionResults = getConditionResults(sourceAST);
    console.log(conditionResults);

    websocket.send(
        JSON.stringify({
            type: 'feedback-updated',
            feedback: conditionResults,
        }),
    );
}
于 2020-03-02T20:40:13.847 回答