javascript - 我无法更改在函数外部初始化的对象的值,或者函数根本没有运行 - 使用 npm 和 nodejs
问题描述
我正在建立一个社交网络 - 为此我使用 nodejs。我是这个主题的新手,这是我关于这个主题的第一篇文章,如果你能理解我,我会很高兴。
在我的社交网络中,我想使用“npm”kmeans 算法中的算法。
我正在尝试在我的项目中运行从 npm 下载的库 - 但我不确定问题是什么。我认为这个问题非常小,但是我坐了几个小时却无法弄清楚。
我正在添加到目前为止我所做的代码:
//kmeans.js file
const kmeans = require('kmeans-engine');
exports.addUserkMeansMatch = (req, res) => {
const engineers = [
// frontend engineers
{ html: 5, angular: 5, react: 3, css: 3 },
{ html: 4, react: 5, css: 4 },
{ html: 4, react: 5, vue: 4, css: 5 },
{ html: 3, angular: 3, react: 4, vue: 2, css: 3 },
// backend engineers
{ nodejs: 5, python: 3, mongo: 5, mysql: 4, redis: 3 },
{ java: 5, php: 4, ruby: 5, mongo: 3, mysql: 5 },
{ python: 5, php: 4, ruby: 3, mongo: 5, mysql: 4, oracle: 4 },
{ java: 5, csharp: 3, oracle: 5, mysql: 5, mongo: 4 },
// mobile engineers
{ objc: 3, swift: 5, xcode: 5, crashlytics: 3, firebase: 5, reactnative: 4 },
{ java: 4, swift: 5, androidstudio: 4 },
{ objc: 5, java: 4, swift: 3, androidstudio: 4, xcode: 4, firebase: 4 },
{ objc: 3, java: 5, swift: 3, xcode: 4, apteligent: 4 },
// devops
{ docker: 5, kubernetes: 4, aws: 4, ansible: 3, linux: 4 },
{ docker: 4, marathon: 4, aws: 4, jenkins: 5 },
{ docker: 3, marathon: 4, heroku: 4, bamboo: 4, jenkins: 4, nagios: 3 },
{ marathon: 4, heroku: 4, bamboo: 4, jenkins: 4, linux: 3, puppet: 4, nagios: 5 }
];
resultFromKmeans = {check : " this is changed?"};
kmeans.clusterize(engineers, { k: 4, maxIterations: 5, debug: true }, (err, result) => {
console.log('----- Results -----');
console.log(`Iterations: ${result.iterations}`);
console.log('Clusters: ');
console.log(result.clusters);
resultFromKmeans = { ...result.clusters}; //<-- here is the problem. this not override "resultFromKmeans".
})
return res.json(resultFromKmeans);
};
//index.js file
const {
addUserkMeansMatch
} = require('kmeans.js');
app.get('/kmeans', addUserkMeansMatch);
exports.api = functions.region('europe-west1').https.onRequest(app);
问题是:它想从 addUserkMeansMatch 函数中获取,目前只有关于找到的集群的信息,所以我用我想要的结果初始化 resultFromKmeans 对象。但是好像我没有进入函数,或者运行函数时resultFromKmeans的值没有变化。我不知道该怎么办。
编辑 这是修改后的代码,但我不明白。我不懂为什么
//Add user k-means matches
exports.addUserKmeansMatch = (req, res) => {
const engineers = [
// frontend engineers
{ html: 5, angular: 5, react: 3, css: 3 },
{ html: 4, react: 5, css: 4 },
{ html: 4, react: 5, vue: 4, css: 5 },
{ html: 3, angular: 3, react: 4, vue: 2, css: 3 },
// backend engineers
{ nodejs: 5, python: 3, mongo: 5, mysql: 4, redis: 3 },
{ java: 5, php: 4, ruby: 5, mongo: 3, mysql: 5 },
{ python: 5, php: 4, ruby: 3, mongo: 5, mysql: 4, oracle: 4 },
{ java: 5, csharp: 3, oracle: 5, mysql: 5, mongo: 4 },
// mobile engineers
{ objc: 3, swift: 5, xcode: 5, crashlytics: 3, firebase: 5, reactnative: 4 },
{ java: 4, swift: 5, androidstudio: 4 },
{ objc: 5, java: 4, swift: 3, androidstudio: 4, xcode: 4, firebase: 4 },
{ objc: 3, java: 5, swift: 3, xcode: 4, apteligent: 4 },
// devops
{ docker: 5, kubernetes: 4, aws: 4, ansible: 3, linux: 4 },
{ docker: 4, marathon: 4, aws: 4, jenkins: 5 },
{ docker: 3, marathon: 4, heroku: 4, bamboo: 4, jenkins: 4, nagios: 3 },
{ marathon: 4, heroku: 4, bamboo: 4, jenkins: 4, linux: 3, puppet: 4, nagios: 5 }
];
kmeans.clusterize(engineers, { k: 4, maxIterations: 5, debug: true }, (err, result) => {
res.json(result.cluster111111s)
.catch((err) => {
console.error(err);
return res.status(500).json({ error: err.code });
});
})
};
解决方案
您遇到的问题是您res.json(resultFromKmeans)
在更新之前返回。当您kmeans.clusterize
在上面的代码中使用时,您正在为其附加一个回调,这实际上是说,“嘿,当您完成运行 clusterize 时,您可以使用结果调用此函数以便我可以处理它吗?”。但是因为您在值完成之前将其发回,所以您会得到错误的结果。
等待结果的最简单方法是res.json()
从回调中调用。不要忘记处理的值err
!
const kmeans = require('kmeans-engine');
exports.addUserkMeansMatch = (req, res) => {
const engineers = [ /* ... */ ];
kmeans.clusterize(engineers, { k: 4, maxIterations: 5, debug: true }, (err, result) => {
console.log('----- Results -----');
console.log(`Iterations: ${result.iterations}`);
console.log('Clusters: ');
console.log(result.clusters);
res.json(result.clusters); // no need to clone it, just return it as-is.
});
};
推荐阅读
- javascript - 历史 pushState 抛出 Uncaught DOMException
- haskell - 禁止标准输出中的引号(hackerrank)
- flutter - 如何在 Flutter 中的所有平台(包括 Web)上播放音频
- autodesk-forge - forge和Bim 360的衍生服务有区别吗?
- laravel - Kubernetes 副本数量与性能
- python - 检查 pandas 数据框日期列的日期格式是否正确?
- php - 在 laravel 中显示管理员视图
- javascript - 响应正文为空(获取请求)
- c++ - 由于缺少类模板而导致编译面向对象代码的 nvcc 问题
- c - c中的“并非所有控制路径都返回一个值”,分数判别