将返回的结果导出到另一个文件

时间:2018-08-21 12:59:00

标签: javascript node.js mongodb express mongoose

如何将以下api的返回结果调用到另一个js文件中的其他函数?我知道这个问题是重复的,但不会返回结果。因此,在标记为重复项之前,请三思而后行。

router.post("/:projectId/events/enriched", checkAuth, (req, res, next) => {
    const enrichedEvent = new EnrichedEvent({
        _id: mongoose.Types.ObjectId(),
        name: req.body.name,
        projectId: req.params.projectId, //taking from url
        description: req.body.description,
        regex: req.body.regex ,
        kafkaOptions: req.body.kafkaOptions     
    });
    return enrichedEvent.save()  // need all the saved data in another file 
        .then(result => {
            console.log(result);
            res.status(201).json({
                message: "Event stored",
                createdEvent: {
                    _id: result._id,
                    projectId: result.projectId,
                    name: result.name,
                    description: result.description,
                    kafka: result.kafkaOptions,
                    filters: result.filters,
                    regex: result.regex,
                }
            });

            return Project.findOneAndUpdate({
                _id: result.projectId
            }, {
                $push: {
                    enrichedEvents: result._id
                }
            })
        })
       .catch(err => {
            console.log(err);
            res.status(500).json({
                error: err
            });
        });

});

1 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您想从另一个JS文件中获得return enrichedEvent.save()…的结果,而不必调用HTTP API?

如果是这样,我建议您从API中提取逻辑。您可以执行以下操作:

// do-something.js
module.exports = function doSomething(projectId, options, onSave) {
  const enrichedEvent = new EnrichedEvent({
    _id: mongoose.Types.ObjectId(),
    name: options.name,
    projectId: projectId,
    description: options.description,
    regex: options.regex,
    kafkaOptions: options.kafkaOptions
  });

  return enrichedEvent
    .save()
    .then(result => {
      onSave(result);

      return Project.findOneAndUpdate(
        {
          _id: result.projectId
        },
        {
          $push: {
            enrichedEvents: result._id
          }
        }
      );
    });
}

您可以通过自己的API进行调用:

const doSomething = require('./do-something');

router.post("/:projectId/events/enriched", checkAuth, (req, res, next) => {
  return doSomething(req.params.projectId, req.body, (result) => {
      console.log(result);
      res.status(201).json({
        message: "Event stored",
        createdEvent: {
          _id: result._id,
          projectId: result.projectId,
          name: result.name,
          description: result.description,
          kafka: result.kafkaOptions,
          filters: result.filters,
          regex: result.regex
        }
      });
    })
    .catch(err => {
      console.log(err);
      res.status(500).json({
        error: err
      });
    });
});

您可以从任何其他JS文件中调用doSomething,以提供不同的上下文:

const doSomething = require('path/to/do-something');

请注意,我对功能签名和内容做了一些快速的设计决策,但是由您决定要在何处分离事物并为其命名。主要思想是通过摆脱特定于API的所有内容来提取函数。