Javascript 为什么我使用更改流得到错误的参数
我正在构建一个应用程序的功能,通过点击列表中的符号(例如:MSFT-Microsoft、AAPL-Apple、GOOG-Google)来绘制图表。符号将由routeJavascript 为什么我使用更改流得到错误的参数,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时,一切都
router.get('/app/:symbol',getWebApi)发送
作为参数,用于从数据库绘制和更新图表数据
数据库在一定的时间间隔内更新,并由MongoDB-change streams
观察,以将数据推送到前端on('change')
。这是我的问题。当我第一次单击MSFT
-req.parms.symbol:MSFT
时,一切都正常工作。第二次单击AAPL
-req.parms.symbol:AAPL
firstconsole.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时都有一个闭包,这将准确地解释您看到的内容。