Назначьте, что возвращает res.json переменной в Node.js

#javascript #node.js #express

#javascript #node.js #экспресс

Вопрос:

Я создаю социальную сеть — и для этого я использую Node.js . Я новичок в этой теме, и это мой первый пост на эту тему, я буду рад, если вы меня поймете.

В моей социальной сети я хочу использовать алгоритм, который имеет его в алгоритме 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 }
  ];

  kmeans.clusterize(engineers, { k: 4, maxIterations: 5, debug: true }, (err, result) => {
    res.json(result.clusters)
    .then((data) => {
    let resultCluster = data; //<--- I want to perform a calculation on the object and then return it.
      res.json(resultCluster)
    })
    .catch((err) => {
      console.error(err);
      return res.status(500).json({ error: err.code });
    });
  })
};
 
 //index.js file

const {
  addUserkMeansMatch
} = require('kmeans.js');

app.get('/kmeans', addUserkMeansMatch);
exports.api = functions.region('europe-west1').https.onRequest(app);
 

Проблема в том, что я хочу вставить информацию, которую возвращает функция kmeans.clusterize, в объект resultCluster . Я не могу ввести информацию в resultCluster.

Затем я хочу выполнить вычисления с помощью resultCluster и вернуть то, что я буду иметь в вычислениях с помощью resultCluster.

Комментарии:

1. Что такое res (т. Е. Какую серверную среду вы используете для вызовов addUserKmeansMatch )? Это выглядит как http-ответ, записываемый на сервере. Если это так, .json() метод не возвращает обещание. Действительно непонятно, почему вы делаете res.json(result.clusters) and then res.json(resultCluster) .

2. На самом деле это то, как вы вызываете кластеризацию в kmeans. kmeans.clusterize(engineers, { k: 4, maxIterations: 5, debug: true }, (err, result) => { if (err) console.error(err); else { // Do operations on data } }

3. @ParikshithKedilayaM Нет, не throw err; в асинхронном обратном вызове.

4. @Bergi Я обычно делаю это таким образом. Всегда лучше войти в консоль. Спасибо.

5. @Bergi Спасибо за помощь. Можете ли вы сказать мне, что не ясно, я объясню еще раз.

Ответ №1:

Вы вызываете res.json() дважды, и вы используете синтаксис promise для этого без причины. Это должно быть просто

 kmeans.clusterize(engineers, { k: 4, maxIterations: 5, debug: true }, (err, result) => {
  if (err) {
    console.error(err);
    res.status(500).json({ error: err.code });
  } else {
    const data = result.clusters; 
    … // perform a calculation on the object
    res.json(data);
  }
})