Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我使用更改流得到错误的参数_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript 为什么我使用更改流得到错误的参数

Javascript 为什么我使用更改流得到错误的参数,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我正在构建一个应用程序的功能,通过点击列表中的符号(例如:MSFT-Microsoft、AAPL-Apple、GOOG-Google)来绘制图表。符号将由routerouter.get('/app/:symbol',getWebApi)发送作为参数,用于从数据库绘制和更新图表数据 数据库在一定的时间间隔内更新,并由MongoDB-change streams观察,以将数据推送到前端on('change')。这是我的问题。当我第一次单击MSFT-req.parms.symbol:MSFT时,一切都

我正在构建一个应用程序的功能,通过点击列表中的符号(例如:MSFT-Microsoft、AAPL-Apple、GOOG-Google)来绘制图表。符号将由route
router.get('/app/:symbol',getWebApi)发送
作为参数,用于从数据库绘制和更新图表数据

数据库在一定的时间间隔内更新,并由
MongoDB-change streams
观察,以将数据推送到前端
on('change')
。这是我的问题。当我第一次单击
MSFT
-
req.parms.symbol:MSFT
时,一切都正常工作。第二次单击
AAPL
-
req.parms.symbol:AAPL
first
console.log()
为我提供了符号的正确参数,但一旦它点击('change')它将
console.log()
从第一次单击开始的符号
MSFT
,并替换为当前参数
AAPL

在第三次点击时,同样的事情也会发生。所以我很困惑为什么我会得到以前单击时调用的参数。如果你有任何想法,我将不胜感激。谢谢大家!

upd:打开更改流时,即使在请求处理程序完成后,它仍保持打开状态。这就解释了为什么当我发出多个API请求时,会在('change')事件上得到多个

控制器-stock.js

exports.getWebApi = async (req, res) => {
  try {
    const { symbol } = req.params;

    console.log('on entry req.params.symbol: ', symbol);
    console.log(typeof symbol);

    const apiKeyAlpha = process.env.API_KEY_ALPHAVANTAGE;

    const urlCompact = `https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=${symbol}&outputsize=compact&apikey=${apiKeyAlpha}`;

    const webApiData = await Db.fetchWebApiStock(urlCompact);
    await Db.creatUpdateStock(symbol, webApiData);

    const db = mongoose.connection;
    const taskCollection = db.collection('stocks');
    const pipeline = [
      {
        $match: {
          'ns.db': 'myapp',
          'ns.coll': 'stocks',
          'fullDocument.symbol': symbol,
        },
      },
    ];

    const options = { fullDocument: 'updateLookup' };
    const changeStream = taskCollection.watch(pipeline, options);

    changeStream.on('change', change => {
      console.log('req.params.symbol in change: ', symbol);

      const { fullDocument } = change;

      const logData = fullDocument.data.map(item => ({
        date: parseFloat(item.date),
        open: parseFloat(item.open),
        high: parseFloat(item.high),
        low: parseFloat(item.low),
        close: parseFloat(item.close),
        volume: parseInt(item.volume),
      }));

      // pusher.trigger(channel, 'AnyEvent', {
      //   chartData: logData,
      //   symbol: fullDocument.symbol,
      // });

    });

    res.send(webApiData);
  } catch (ex) {
    console.log('getWebApi error:', ex);
  }
};
第一次单击时

GET /stock/chart/MSFT 304 22.401 ms - -
GET /JS/chart.js 304 0.282 ms - -
GET /JS/chartWebSearch.js 304 0.286 ms - -
on entry req.parms.symbol:  MSFT
string
GET /stock/app/MSFT 304 896.008 ms - -
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
GET /stock/updatedb 304 908.734 ms - -
第二次单击时

GET /stock/chart/AAPL 304 4.494 ms - -
GET /JS/chart.js 304 0.361 ms - -
GET /JS/chartWebSearch.js 304 0.354 ms - -
on entry req.parms.symbol:  AAPL
string
req.params.symbol in change:  MSFT
GET /stock/app/AAPL 304 558.962 ms - -
req.params.symbol in change:  MSFT
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
GET /stock/updatedb 304 893.851 ms - -
GET /stock/chart/GOOG 304 5.002 ms - -
GET /JS/chart.js 304 0.296 ms - -
GET /JS/chartWebSearch.js 304 0.451 ms - -
on entry req.parms.symbol:  GOOG
string
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  AAPL
GET /stock/app/GOOG 304 741.986 ms - -
req.params.symbol in change:  MSFT
req.params.symbol in change:  GOOG
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  GOOG
req.params.symbol in change:  GOOG
req.params.symbol in change:  GOOG
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  GOOG
req.params.symbol in change:  GOOG
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
GET /stock/updatedb 304 820.259 ms - -
第三次单击时

GET /stock/chart/AAPL 304 4.494 ms - -
GET /JS/chart.js 304 0.361 ms - -
GET /JS/chartWebSearch.js 304 0.354 ms - -
on entry req.parms.symbol:  AAPL
string
req.params.symbol in change:  MSFT
GET /stock/app/AAPL 304 558.962 ms - -
req.params.symbol in change:  MSFT
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
GET /stock/updatedb 304 893.851 ms - -
GET /stock/chart/GOOG 304 5.002 ms - -
GET /JS/chart.js 304 0.296 ms - -
GET /JS/chartWebSearch.js 304 0.451 ms - -
on entry req.parms.symbol:  GOOG
string
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  AAPL
GET /stock/app/GOOG 304 741.986 ms - -
req.params.symbol in change:  MSFT
req.params.symbol in change:  GOOG
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  GOOG
req.params.symbol in change:  GOOG
req.params.symbol in change:  GOOG
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
req.params.symbol in change:  GOOG
req.params.symbol in change:  GOOG
req.params.symbol in change:  AAPL
req.params.symbol in change:  AAPL
req.params.symbol in change:  MSFT
req.params.symbol in change:  MSFT
GET /stock/updatedb 304 820.259 ms - -

请以文本的形式发布文本,而不是文本的图像。您正在不断添加新的
change
处理程序。@DaveNewton不是当我更改网页时,
change
处理程序被杀死的人?@DaveNewton我很困惑。它是如何工作的呢?这里没有离开寻呼机的导航——如果页面重新加载,是的,所有当前的js代码都会消失。如果您毫不犹豫地添加了一个处理程序,在每次执行getWebApi时都有一个闭包,这将准确地解释您看到的内容。